8

ゲームで、アイテムのマップを検索し、ボードの特定の正方形にあるアイテムを返したいと思います。しかし、正方形が空の場合はどうなりますか? (アイテムはボード構造に保存されません。この質問の目的では気にしないでください。) 以下のコードがありますが、「空の」参照を返すにはどうすればよいですか?

map<pair<int, int>, Item*> _items;

Item& itemAt(int row, int col) const {
    try {  
        return *_items.at(make_pair(row, col));
    } catch(out_of_range& e) {
        return // what goes here?            
    } 
}

それとも、これは間違ったアプローチfind()ですか?

4

4 に答える 4

9

この場合、「ゼロまたは 1 つのオブジェクト」を表す手段としてポインターを使用すると便利です。

Item* itemAt(int row, int col) const {
    try {
        return _items.at(make_pair(row, col));
    } catch(out_of_range& e) {
        return nullptr;
    }
}

ただし、使用std::map::find()はおそらくより高速でクリーンなアプローチです。

于 2013-05-27T13:09:03.660 に答える
3

クライアント コードが存在しない項目を要求することがエラーである場合はthrow、失敗を報告し、Item&.

エラーでない場合はvalue_type、 のmapが既にItem*返されているため、戻り値の型を a に変更し、要求された位置のアイテムが存在しないことを示すためNode*に戻り、 を使用します。nullptrmap::find()

Item&戻り値の型にすでに存在する寿命の問題を回避するには、 を に変更するvalue_typeことを検討してstd::shared_ptr<Item>ください。クライアント コードに値への参照または未加工のポインタがありmap、その要素が から削除されたmap場合、クライアントにはダングリング ポインタ/参照が残ります。に切り替えると、std::shared_ptr<Item>このシナリオを回避できます。itemAt()関数は を返しますstd::shared_ptr<Item>Itemこれには、の s を明示的にdmapにする必要がないという利点もあります。delete

于 2013-05-27T13:09:11.663 に答える
1

実際、他の人も同じ問題を抱えています:

  • 彼らの何人かは書いたboost::optional
  • ポインターと戻り値のペアを返すことができます
  • 例外をスローできます
  • null オブジェクトを返すことができます
于 2013-05-27T20:26:09.963 に答える