Eine ungültige Referenz wird zurückgegeben

8

Manchmal, wenn ich in C ++ programmiere, wünsche ich, dass es für jede Variable einen undefined -Wert gibt, so etwas wie Javascript !. Wenn ich zum Beispiel einen Wert für das Out-of-Bounds-Element eines Arrays zurücksende, war es nützlich, ein undefined zurückzugeben, anstatt eine Ausnahme auszulösen, oder:

%Vor%

Eine andere schmutzige Option (Meiner Meinung nach) gibt eine Referenz einer vordefinierten Variable als schlechte Referenzvariable zurück. Ich weiß, dass wir null oder etwas Ähnliches einer Referenzvariablen nicht zuordnen können.

Gibt es ein weiteres wohlgeformtes Muster, um eine Referenz zurückzugeben, bei der der Aufrufer die Möglichkeit hat, den zurückgegebenen Wert herauszufinden, nicht gültig?

BEARBEITEN: Ich meine nicht ein pointer

    
deepmax 16.11.2012, 12:20
quelle

4 Antworten

5

Sie können boost :: optional als @chris in seinem Kommentar erwähnt verwenden. Es kommt als Teil der Boost-Bibliothek. Weitere Informationen finden Sie auf dieser Seite .

Modifiziert MyArray class:

%Vor%

Verwendung:

%Vor%     
Miroslav Bajtoš 16.11.2012, 12:31
quelle
3
  

Ich wünschte, es gäbe für jede Variable einen undefinierten Wert wie etwa Javascript!

Sie haben nur einen "undefinierten" Wert für Zeiger (nullptr). Eine Referenz ist (per Definition) etwas, das auf eine gültige Instanz verweist.

Um einen Verweis auf ein statisches Objekt zurückzugeben, sollten Sie zwischen konstanten und nicht konstanten Werten Ihres Operators unterscheiden:

%Vor%

};

    
utnapistim 16.11.2012 13:02
quelle
2

Was auch immer Sie denken, Ihre Lösung muss in das Typsystem passen. Also muss Ihre Funktionssignatur explizit (auf die eine oder andere Weise) sagen, dass das Ergebnis T sein kann, aber es kann auch etwas anderes sein.

Übliche Wege dafür sind:

  • Anstatt einen Wert zurückzugeben, geben Sie einen Statuscode zurück und geben den Wert über einen "out" -Parameter (einen Zeiger oder eine Referenz) aus:

    %Vor%
  • Liefert ein Tupel (Status, Wert) wie:

    %Vor%

    (Wenn das zweite Tuple-Element nicht erhalten werden konnte, ist es irrelevant - T muss einen Standardkonstruktor haben)

  • Verwenden Sie boost::variant (flexibel, erfordert jedoch Boost)

  • Verwenden Sie boost::optional (einfachere Version von oben, wenn Sie nur "entweder T oder nichts" brauchen)
Kos 16.11.2012 12:50
quelle
0

Das Hauptziel von Referenzen besteht darin, ungültige (NULL) Werte zu vermeiden, während Funktionen ihre Argumente ändern und keine Daten kopieren dürfen. Wenn Sie einen NULL-Wert benötigen, verwenden Sie einen Zeiger.

    
japreiss 16.11.2012 14:59
quelle

Tags und Links