this auf NULL prüfen in Set/Get Methoden



  • sowas hab ich gerade gefunden:

    bool CChar::GetMed( void ) const
    {
        if(this==NULL)
            return false;
        return med;
    }
    void CChar::SetMed( bool newValue )
    {
        if(this==NULL)
            return;
        med = newValue;
    }
    

    Ist das nicht ein bisschen sinnlos?? 😮



  • es ist.



  • ich würde sagen, dass es manchmale schon sinn machen kann.
    zb. wenn die settings dann in eine datei gespeichert bzw. daraus geladen werden sollen.
    warum sollte ich einen wert, der sich nicht geändert hat nochmal speichern bzw. aus einem file laden ? - diese unnötigen sachen kann ich mit dem vergleich und rücksprung sparen!



  • @<->
    Aber this kann nie NULL sein



  • Es ging wohl eher konkret um den this-Zeiger, als um solche Prüfungen allgemein.



  • 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