C ++: Gibt NULL anstelle von struct zurück

8

Ich habe eine Struktur Foo . Im Pseudocode:

%Vor%

Wie kann ich das in C ++ erreichen?

Bearbeitet um zahlreiche Ungenauigkeiten zu entfernen.

    
Nick Heiner 15.06.2010, 23:34
quelle

8 Antworten

12

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 .

    
GManNickG 15.06.2010, 23:40
quelle
4

Wirf eine Ausnahme aus. Dafür sind sie da.

    
Puppy 15.06.2010 23:45
quelle
3

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.

    
fredoverflow 15.06.2010 23:53
quelle
1

Das funktioniert auch nicht in C #. Sie sollten einen Zeiger auf Foo zurückgeben.

    
Matthew Flaschen 15.06.2010 23:35
quelle
1

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.

    
Justin Ardini 15.06.2010 23:36
quelle
1

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%     
zildjohn01 15.06.2010 23:41
quelle
1

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.

    
stonemetal 16.06.2010 15:12
quelle
0

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:

  1. new , wenn es fehlschlägt, ansonsten bedingungslos einen Wert zurückgeben
  2. gibt einen Zeiger zurück - aber das lässt die Verantwortung für throw in der Luft, wenn es nicht länger im Speicher bleibt
  3. Umschlinge es in einem [templated] Wrapper-Objekt, das die Bedingungen genauso behandelt wie .NET's delet (Ich lasse jemanden mit dem richtigen UPDATE reinhören: @Mike Seymour sagt, es ist Nullable<T> )
  4. Verwenden Sie das Null-Object-Muster, um einen geeigneten Wert zurückzugeben, der das Richtige tut, wenn er auf der Client-Seite als gültiges Ergebnis behandelt wird
Ruben Bartelink 15.06.2010 23:36
quelle