2017-01-05 6 views
2

私はクラスに格納されたデータへのポインタを(クラスが正確にハッシュテーブルである)を返すと呼ばれる私のクラスのメソッド「を見つける()」を有しています。クラスのデータへのポインタを返すのは悪い考えですが、何も見つけられませんでした。ユーザーが自分のオブジェクトを削除(変更)する恐れがないようにデータを見つける方法に関する提案はありますか?コンテナといつも問題ザッツクラス(C++)のジェネリックfind関数の戻り値の競合、返すものは?

Data const* find(Key const& key); 
+3

イテレータを使用し、 'end()'が見つからなければそれを返しますか? – NathanOliver

+0

リファレンスの使用はどうですか? –

答えて

1

(クラスは、ハッシュテーブルであり、それは完全に見つける作品): これは、findメソッドであります。基本的には次のように要約:

あなたはfindの2つのバージョンが必要です。

Data const * find(Key const &) const; 
Data *  find(Key const &); // non-const 

明らかにあなたはイテレータの代わりにポインタを使用することができますが、これは自分自身では何も解決しませんが。そして、あなたはconst -iterator const -versionと(非const)-iterator(非const)バージョンが必要と思います。

設計上の決定のこれらの種類のアイデアを得るために、私は、STL、すなわちコンサルティングをお勧めします。この場合、unordered_mapunordered_map::findです。

+0

は、ユーザーが自分のデータを削除することができませんことを確認したい場合、あなたは(オプションを使用するなど)のコピーを返す必要があります 'const'方法... – m8mble

+0

であるべき。さもなければあなたは決して確信しません。 – user2146414

+0

'const'ポインタが指すものを' delete'するために 'const'キャストは必要ありません。 'delete' [' const'ポインタで呼び出すことができます。](http://coliru.stacked-crooked.com/a/22731af5ab783e98) – jaggedSpire

0

:あなたが、その後のconstへのポインタを返す必要があり

Data* find(const Key& key) { 
    if (isMember(key) == false) { 
     return NULL; 
    } 
    int hash_idx = hash_function(key, table_size); 
    return &(*((table[hash_idx])->find(key))); 
}