this auf NULL prüfen in Set/Get Methoden



  • Original erstellt von MaSTaH:
    @<->
    Aber this kann nie NULL sein

    foo* foovar = NULL;
    foovar->methode();
    


  • @Lars
    Aber this ist ein Pointer auf das Objekt. Bei einem Nullpointer gibt es kein Objekt...



  • Lars: Das erzeugt UB. Auch wenn es für nicht-virtuelle Funktionen straightforward definiert werden könnte.



  • Hab grad keine Zeit zum Nachschauen, aber:
    Welchen Wert hat this, wenn die Funktion static ist?
    Oder fängt der Compiler die Verwendung von this in static-Funktionen ab?



  • Original erstellt von Kauz01:
    Oder fängt der Compiler die Verwendung von this in static-Funktionen ab?

    Bin mir im Moment nicht sicher, aber der Compiler sollte das abfangen. Mit this könnte dann ja jede Instanz gemeint sein. Auf jeden Fall sollte es zu undefiniertem Verhalten führen...



  • Habs ausprobiert. Genau wie ich mir dachte:
    "error C2671: 'Foo' : static member functions do not have 'this' pointers"



  • this existiert in statischen Elementfunktionen nicht.



  • Welchen Wert hat this, wenn die Funktion static ist?

    Hä? Natürlich gar keinen. Eine statische Funktion hat keinen this-Zeiger. Du kannst this dort überhaupt nicht referenzieren. Also spielt der Wert aus Sicht von C++ überhaupt keine Rolle.
    Das:

    class Foo
    {
    public:
    static void foo()
    {
    if (this == 0)
    true;
    }
    };
    

    lässt sich nicht übersetzen.

    Oder habe ich deine Frage missverstanden?

    foo* foovar = NULL;
    foovar->methode();

    -> ist hier gleichbedeutend mit (*foovar).methode().
    (*foovar) dereferenziert aus Sicht von C++ den Zeiger foovar und damit hier den Nullzeiger. Das Dereferenzieren eines Nullzeigers führt immer zu undefiniertem Verhalten. Alles was danach kommt, insbesondere der Test this != 0 spielt keine Rolle mehr. Das Programm ist zu diesem Zeitpunkt längst in einem unbrauchbaren Zustand.

    Zwar wird es äußerst schwierig sein einen Compiler zu finden der hier einen Dereferenzierung von foovar druchführt (solange methode nicht virtuell ist), dass ändert aber nichts an der durch den C++ Standard definierten Semantik.

    Kurz: Man findet zwar häufig einen solchen Test (z.B. in MS-Code) und unter bestimmten Voraussetzungen macht er auch sinn, in Standard-C++ ist dieser Test aber *immer* sinnlos, falsch, irreführend und hinterhältig.



  • @ HumeSikkins

    Fertig lesen und "Hä" sparen.

    [edit]
    Anmerkung:
    Mir war nur ein kurzer, nicht durchdachter und jetzt auch hinfälliger Gedanke durch den Kopf geschossen:
    Sollte es in einer static-Funktion möglich sein, festzustellen, ob Sie über eine Instanz aufgerufen wurde (z.B über die Abfrage this != NULL), so könnte man eventuell auf Member bzw. Methoden der Instanz zugreifen und Verarbeitungen beschleunigen.
    Da die Verwendung von nicht-statischen Methoden in einer static-Methode natürlich nicht erlaubt ist, ist der "Geistesblitz" hinfällig.
    War grad mit Gedanken bei anderen Themen und hab deshalb das relevante übersehen.
    [/edit]

    [ Dieser Beitrag wurde am 23.05.2003 um 11:27 Uhr von Kauz01 editiert. ]



  • @Kauz01: Hääääää? 😉


Anmelden zum Antworten