Ich habe eine Struktur Foo
. Im Pseudocode:
Wie kann ich das in C ++ erreichen?
Bearbeitet um zahlreiche Ungenauigkeiten zu entfernen.
C ++ - Objekte können niemals null oder leer sein. Zeiger können einen Nullzeigerwert enthalten, der anzeigt, dass sie auf nichts zeigen.
Die typische Lösung wäre eine Ausnahme auszulösen. Andernfalls verwenden Sie einen Zeiger; Stellen Sie nur sicher, dass Sie die Adresse eines temporären nicht zurückgeben.
Ich würde nicht empfehlen, C ++ mit Wissen aus anderen Sprachen zu unterrichten, Sie werden sich verletzen. Schnapp dir ein gutes Anfängerbuch , es ist der beste Weg zu lernen .
Sie können in boost::optional
nachsehen und sehen, ob es Ihren Anforderungen entspricht. Jedoch:
gib foo zurück wenn foundFoo else someErrorCode
Das lässt mich denken, dass es besser wäre, eine Ausnahme zu werfen, wenn Sie foo nicht finden.
Das funktioniert auch nicht in C #. Sie sollten einen Zeiger auf Foo zurückgeben.
Eine Möglichkeit ist es, einen Zeiger auf foo zurückzusetzen:
%Vor% Eine weitere Möglichkeit, ein NullFoo
einer Art zu definieren, möglicherweise als struct
, das Foo
mit einer leeren Implementierung erweitert. Weitere Informationen zu dieser Idee finden Sie im Null-Objektmuster .
Bearbeiten: Die modifizierte Frage ist etwas anders, und wie andere Leute schon erwähnt haben, ist es am besten, wenn Sie eine Ausnahme werfen, anstatt eine der oben genannten zu tun.
In C ++ ist es nicht möglich, auf Zeiger oder eine Bibliothekslösung außerhalb der Standardbibliothek zurückzugreifen. (Boost ist kein Teil der Standardbibliothek, es ist eine Lösung von Drittanbietern.)
In C # können Sie Nullable<Foo>
verwenden.
Im Gegensatz zu Billys Kommentar sind Strukturen Werttypen, keine Referenztypen, und Nullable kann auf beliebige -Werttypen angewendet werden, nicht nur auf eingebaute. Das folgende kompiliert ganz gut:
%Vor%Finden Sie nicht wirklich eine Ausnahmesituation? Dann eine Ausnahme auslösen. Erwarten, nicht foo zu finden? Lassen Sie die Funktion einen Fehlercode zurückgeben und übergeben Sie den foo über einen Referenzparameter, wobei foo nur gültig ist, wenn die Funktion keinen Fehler zurückgibt.
Sie können dies auch nicht in C # tun - Sie müssten new Foo()
, nicht null
zurückgeben, um den Compiler glücklich zu machen.
Dito im Fall C ++ - Sie müssen eine Struktur instanziieren, wenn Sie nach Wert zurückkehren wollen. Wenn nicht, möchten Sie mit Zeiger zurückgeben (in diesem Fall wäre% code_de% ing oder gibt einen Zeiger auf einen auf andere Weise zugewiesenen zurück, was eine unordentliche Semantik der Eigentumsübertragung in die Gleichung bringt).
EDIT: Basierend auf Ihrem Update. Es scheint so, als ob Sie entweder einen Wert oder einen 'Null'-Metawert zurückgeben möchten, der' nicht gefunden 'anzeigt. Sie können dies auf verschiedene Arten tun:
new
, wenn es fehlschlägt, ansonsten bedingungslos einen Wert zurückgeben throw
in der Luft, wenn es nicht länger im Speicher bleibt delet
(Ich lasse jemanden mit dem richtigen UPDATE reinhören: @Mike Seymour sagt, es ist Nullable<T>
) Tags und Links c++ error-handling null-object-pattern