カスタムオブジェクトのリストであるメンバー変数を含むクラスがあります。このリストを調べて、指定された名前のゲッター関数を見つけようとしているゲッター関数を作成しようとしています。見つかった場合は、定数参照で上記のオブジェクトを返すか、「名前「name」のオブジェクトが見つかりません」と出力したいと思います。そうでなければ、私のプログラムをクラッシュさせることなく。何か案は?一致するオブジェクトが存在する場合にブール値を返すだけの別の関数を作成し、それを最初に呼び出すことができると考えています。trueが返された場合は、指定されたアイテムを取得します。ただし、これは非効率的であり、もっとうまくやりたいと思います。
3 に答える
オプション:
見つからない場合は例外をスローします-呼び出し元でキャッチします
イテレータを返します-
== .end()
呼び出し元に見つからないかどうかを確認します(STLがこれを行います)関数にポインタを返し
NULL
、見つからない場合は返すようにします見つからないことを示す特別なオブジェクトを用意し、見つからない場合はそのオブジェクトへの参照を返します
事前に存在を確認してください(あなたが言ったように)
存在チェックと値の取得を分離するという考えは正しいです。
それは本質的に非効率的ではありません、そしてとにかく、それを試してみて、それがボトルネックであることが判明するかどうかを確認してみませんか?最初の推進力が非効率的であると思われる場合は、ヒントまたはおそらくチェックの結果全体をキャッシュするだけです。
それ以外の場合、オプションには、見つからない場合に例外をスローすることや、Fallible
関数の結果としてBaron / Nackmanクラスの実装を使用することが含まれboost::optional
ます(または単に自分でロールする)
そして、それについて考えると、ポインタを返すだけです。これは、ポインタまたは配列オブジェクトタイプにとっては厄介な場合がありますが、一般的にはおそらく最もクリーンなソリューションであるはずです。「オブジェクトが見つかりません」を通知するnullpointerを返します。
2つのバージョンのアクセサーを提供できます。1つは例外をスローするか、サイレントに空のオブジェクトを返します。もう1つには、データが存在しないことを報告するパラメーターがあります。
class Props {
public:
const Object &get( const std::string &name ) const; // throws exception or silently retruns empty
const Object &get( const std::string &name, bool &found ) const; // returns flag
};
C ++ 11では、よりクリーンになる可能性があります。
class Props {
public:
const Object &get( const std::string &name, bool &&found = bool() ) const;
};
私はそれをC++11バージョンに戻します、私は新しい言語機能にあまり精通していません、これはよりきれいではないようです。