Test auf undefinierts Objekt



  • Gibt es eigentlich die Möglichkeit neben einem NULL-Test

    If (obj == NULL)
    ...
    if (obj)
    ...
    

    auch so etwas, um ein undefiniertes Objekt bzw. Zeiger zu testen?


  • Mod

    Was zum Teufel meinst du denn damit? Wenn der Linker keine Definition findet, dann kannst du das Objekt auch nicht odr-usen. Und wenn er sie hat, dann kompiliert es auch.

    Edit: Da war ein Satz, der gehörte da überhaupt nicht hin...



  • Es gibt Programmiersprachen, wie z.B. Java, welche keinen Unterschied zwischen Objekt und Referenz oder Zeiger auf ein Objekt machen. Da kann eine Objektvariable schon mal auf kein Objekt zeigen. In C++ gibt es so etwas nicht. Eine Variable vom Typ "Foobar" hat immer ein Objekt. Und das ist auch immer initialisiert. Was das bedeutet, ist von der Klasse ab. Beispielsweise ist ein Objekt vom Typ "std::ifstream" nicht zwangsweise mit einer geöffneten Datei verbunden. Aber dennoch ist das Objekt da.

    In C++ gibt es natürlich noch die Zeiger. Die können durchaus auf 0 getestet werden (NULL sollte man in C++ nicht verwenden). Wobei ein nicht initialisierter Zeiger nicht zwangsweise 0 ist sondern möglicherweise irgendwohin zeigt. Das lässt sich nicht fest stellen. Daher sollten Zeiger immer mit 0 initialisiert werden, wenn das erwartet wird.



  • Umgekehrt (wie bei den Std-Streams) kann man für seine Klasse den bool Operator überladen, der anzeigt, ob ein Objekt in einem "guten" Zustand ist. Was gut bedeutet, musst du aber selbst wissen und dir auch selbst definieren. Dann kannst du solche Abfragen machen wie du da angibst.

    Um mal auf das Beispiel mit dem Std-Stream zurückzukommen:

    std::ifstream ifs; // zwar gültiger Zustand, aber nicht mit einer Datei assoziert
    
    ifs.open("myFile.txt"); // Nun ist eine Datei geöffnet (falls das klappt)
    
    if ( ifs ) // Falls der Stream offen und gültig ist
        std::cout << "Datei ist erfolgreich geöffnet" << std::endl;
    else // ifs ist zwar da, aber du kannst damit nicht wirklich arbeiten
        std::cout << "Datei ist nicht geöffnet" << std::endl;
    

    Über Sinn und Unsinn deines Vorhabens will ich nichts sagen.

    Was hast du eig da vor?



  • Über Sinn und Unsinn deines Vorhabens will ich nichts sagen.

    Was hast du eig da vor?

    Das war rein nur wegen Interesse, ob sowas überhaupt geht. Da es offensichtlich sinnfrei wäre, scheint die Frage ja geklärt zu sein.

    NULL sollte man in C++ nicht verwenden
    

    Ist aber so erst mal besser lesbar, 0 könnte ja nicht unbedingt auf ein Objekt bezogen sein, insofern mag NULL zwar unschön sein, aber ob das wirklich so schlimm ist, glaube ich nicht. 😉



  • dixidix schrieb:

    NULL sollte man in C++ nicht verwenden
    

    Ist aber so erst mal besser lesbar, 0 könnte ja nicht unbedingt auf ein Objekt bezogen sein, insofern mag NULL zwar unschön sein, aber ob das wirklich so schlimm ist, glaube ich nicht. 😉

    Disclaimer: Folgende Aussagen beziehen sich auf die C++-Versionen vor 2011.
    NULL ist nichts anderes als 0, man könnte aber auf die Idee kommen, es sei etwas anderes und bspw. ptr-Overloads gegenüber ints triggern etc.



  • dixidix schrieb:

    0 könnte ja nicht unbedingt auf ein Objekt bezogen sein, insofern mag NULL zwar unschön sein, aber ob das wirklich so schlimm ist, glaube ich nicht. 😉

    Auch NULL könnte nicht unbedingt auf ein Objekt bezogen sein. Es gibt genug Pappnasen, die ein int mit NULL initialisieren.



  • manni66 schrieb:

    dixidix schrieb:

    0 könnte ja nicht unbedingt auf ein Objekt bezogen sein, insofern mag NULL zwar unschön sein, aber ob das wirklich so schlimm ist, glaube ich nicht. 😉

    Auch NULL könnte nicht unbedingt auf ein Objekt bezogen sein. Es gibt genug Pappnasen, die ein int mit NULL initialisieren.

    Echte Pappnasen machen alles, was der Compiler durchläßt.

    virtual void attack(Mob* mob)=0x0;//changed 4/1/03 since =NULL utterly not worked
    

  • Mod

    since =NULL utterly not worked

    Warum nicht? Sollte funktionieren. War um 2003 schließlich ein Makro auf 0...



  • Arcoth schrieb:

    since =NULL utterly not worked

    Warum nicht? Sollte funktionieren. War um 2003 schließlich ein Makro auf 0...

    Könnte auf (0) geändert würden sein…


Log in to reply