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?
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.
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:
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% 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.
Eigentlich hatten andere Leute das gleiche Problem:
boost::optional