if(objektname != null) in C++?



  • Hallo!

    Wie übersetze ich eigentlich die Java-Anweisung

    if(objektname != null) korrekt nach C++ also wie überprüfe ich, ob ein Objekt initialisiert bzw. "echter" Rückgabewert einer Funktion ist? Gibt es in C++ sowas wie Null-Pointer mit denen man Objekte vergleichen kann, auch wenn man für diese keinen ==-Operator definiert hat??

    Cya,
    Cynni



  • Gibt es in C++ sowas wie Null-Pointer mit denen man Objekte vergleichen kann

    Ja und nein. Es gibt Null-Pointer. Aber die vergleicht man mit anderen Zeigern, nicht mit Objekten.

    Das ganze lässt sich aber nicht in einem Satz erklären, da sich C++ mit seiner Value-Semantik hier völlig von Java mit der Referenz-Semantik unterscheidet.
    Du solltest auf jeden Fall also mal ein gutes Tutorial bzw. noch besser ein gutes C++ Buch lesen.

    Kostenlos und ganz hervoragend:
    Thinking in C++ von Bruce Eckel.



  • in C++ ist ein Objekt immer ein Objekt. Ungültige Objekte solltest du (im Normalfall) nicht haben.
    in C++ gibt es den Null-Pointer (ein Makro) NULL, das zu 0 äquivalent ist.
    das kannst du aber nur auf zeiger anwenden. eine referenz kann niemals null sein (wenn man sauber arbeitet)

    ein beispiel:

    #include <new>
    
    int main () {
       for (;;) {
           int *i = new (nothrow) int(42);
           if (i == 0) { //oder if (i == NULL)
              break; //Allokation schlug fehl, Programm beenden
           }
       }
    }
    

    in dem fall liefert new den 0-Zeiger, um anzuzeigen, dass es keinen speicher mehr allokieren konnte.
    das programm lieber nicht ausprobieren, erzeugt ein ziemlich großes speicherloch...



  • @davie: Noch nichts von std::bad_alloc gehört?
    Ich hab immer gedacht, nur malloc() gibt im Fehlerfall 0 zurück!

    ChrisM



  • in C++ gibt es den Null-Pointer (ein Makro) NULL, das zu 0 äquivalent ist.

    Na das nenne ich jetzt einfach mal seeeehr stark vereinfacht (um nicht zu sagen falsch).



  • @ChrisM
    Schau noch mal genau hin. Davie benutzt die *nothrow* Variante von new. Und die liefert in der Tat einen Null-Zeiger im Fehlerfall.



  • NULL ist eine Nullzeigerkonstante, ein konstanter integraler Ausdruck, der als Null ausgewertet wird und deren Typ in jeden beliebigen Zeiger konvertiert werden kann (dem Nullzeigerwert dieses Typs), der sich von allen anderen Werten des Zeigertyps unterscheiden muss, außerdem sind zwei Null-Zeiger desselben Typs gleich
    NULL ist aber implementation defined und kann
    0, 0L aber nicht (void*)0 sein

    zufrieden?

    (edit: deutsch)



  • zufrieden?

    Und ich dachte immer es wäre meine Aufgabe mit zu vielen Details arme Leute zu verwirren 😃


Anmelden zum Antworten