Was soll zurückgegeben werden, wenn ein std :: map :: at out_of_range ausgeht?

8

In einem Spiel möchte ich eine Karte von Gegenständen suchen und die auf einem bestimmten Quadrat der Tafel befindliche zurückgeben. Aber was, wenn das Quadrat leer ist? (Die Elemente sind nicht in der Board-Struktur gespeichert. Das ist für die Zwecke dieser Frage egal.) Ich habe den Code unten, aber was soll ich tun, um eine "leere" Referenz zurückzugeben?

%Vor%

Oder ist das der falsche Ansatz und ich sollte einfach find() verwenden?

    
Jaldhar 27.05.2013, 13:00
quelle

4 Antworten

9

In diesem Fall ist die Verwendung eines Zeigers als Mittel zur Darstellung von "Null oder einem Objekt" nützlich:

%Vor%

Allerdings ist die Verwendung von std::map::find() wahrscheinlich ein schneller und sauberer Ansatz.

    
Roland Levillain 27.05.2013, 13:09
quelle
12

Wenn das Finden eines Elements in Ihrem Programm keine Fehlerbedingung ist, sollten Sie keine Referenz zurückgeben (da Referenzen nicht null sein können). Stattdessen sollten Sie einen (nicht vorhandenen, wahrscheinlichsten) Zeiger zurückgeben und nullptr zurückgeben, falls das Element nicht gefunden wurde:

%Vor%

Wenn andererseits ein Fehler nicht gefunden wird, können Sie eine Referenz (wenn das Element gefunden wird) und die Ausnahme weiterleiten lassen , wenn das Element nicht gefunden wird Die Verantwortung für den Umgang damit würde zu dem Teil Ihres Codes gehören, der über strategisches Wissen darüber verfügt, wie man damit umgeht:

%Vor%     
Andy Prowl 27.05.2013 13:08
quelle
3

Wenn es ein Fehler ist, dass der Client-Code ein Objekt anfordert, das nicht existiert, dann ist throw eine Ausnahme, um den Fehler zu melden und ein Item& zurückzugeben.

Wenn es sich nicht um einen Fehler handelt, ändern Sie den Rückgabetyp als value_type und geben Sie nullptr um anzugeben, dass ein Element an der gewünschten Position nicht existiert und map::find() .

Um lebenslange Probleme zu vermeiden, die bereits mit dem Rückgabetyp Item& vorhanden sind, sollten Sie in Erwägung ziehen, das value_type zu einem std::shared_ptr<Item> . Wenn Clientcode einen Verweis oder einen unformatierten Zeiger auf einen Wert mit dem map hat und wenn dieses Element aus dem map entfernt wird, verbleibt der Client mit einem dangling Zeiger / Verweis. Der Wechsel zu std::shared_ptr<Item> vermeidet dieses Szenario. Die Funktion itemAt() würde ein std::shared_ptr<Item> zurückgeben. Dies hat auch den Vorteil, dass die Item s in map nicht explizit delete d sein müssen.

    
hmjd 27.05.2013 13:09
quelle
1

Eigentlich hatten andere Leute das gleiche Problem:

  • einige von ihnen schrieben boost::optional
  • Sie können ein Zeigerpaar und einen Rückgabewert
  • zurückgeben
  • Sie können eine Ausnahme auslösen
  • Sie können ein Nullobjekt zurückgeben
Alex 27.05.2013 20:26
quelle

Tags und Links