Frage zum this Zeiger


  • Mod

    ( Aber das Programm funktionierte ^^ )

    text *ptr=NULL;
    
    ptr->print_text("hallo ptr ");
    

    😕 Das funktioniert?

    Das sollte mindestens abstürzen. Darf aber auch gerne deine Festplatte formatieren und deine Katze schwängern.

    Deine Ausführungen zum this-Zeiger verstehe ich nicht.

    this ist ein Zeiger auf die aktuell aufrufende Instanz, wenn man eine Klassenmethode aufruft. Man braucht dies in der Regel eher selten, nämlich nur dann wenn man irgendeine Form von Selbstreferenz benötigt. Dies ist zum Beispiel oft der Fall, wenn eine Methode das aufrufende Objekt selbst zurückgeben soll (ein Beispiel wäre der Präinkrementoperator). Die zweite Anwendung ist die Auflösung von gewissen Doppeldeutigkeiten, aber das ist schon eher speziell.



  • SeppJ schrieb:

    ( Aber das Programm funktionierte ^^ )

    text *ptr=NULL;
    
    ptr->print_text("hallo ptr ");
    

    😕 Das funktioniert?

    Das sollte mindestens abstürzen. Darf aber auch gerne deine Festplatte formatieren und deine Katze schwängern.

    Genau so darf es funktionieren, was es wahrscheinlich auch tut, falls print_text keine Datenmember von text benutzt.
    Siehe auch hier.



  • Das ist ist ja niedlich:

    reinterpret_cast<foo*> (0)->bar ();
    

    😃 👍


  • Mod

    drakon schrieb:

    Genau so darf es funktionieren, was es wahrscheinlich auch tut, falls print_text keine Datenmember von text benutzt.
    Siehe auch hier.

    Aber der Standard sagt ziemlich unzweideutig, dass dieses Verhalten undefiniert ist:

    5.5-4 schrieb:

    If the dynamic type of the object does not contain the member to which the pointer refers, the behavior is undefined.

    Ich konnte keine Ausnahme für static-Member finden.

    Du hast aber Recht, dass dieses Konstrukt in der Praxis funktionieren wird.

    P.S.: 😕 Du schreibst doch selber bei deinem Artikel, dass das Verhalten undefiniert ist.



  • SeppJ schrieb:

    drakon schrieb:

    Genau so darf es funktionieren, was es wahrscheinlich auch tut, falls print_text keine Datenmember von text benutzt.
    Siehe auch hier.

    Aber der Standard sagt ziemlich unzweideutig, dass dieses Verhalten undefiniert ist:

    5.5-4 schrieb:

    If the dynamic type of the object does not contain the member to which the pointer refers, the behavior is undefined.

    Ich konnte keine Ausnahme für static-Member finden.

    Du hast aber Recht, dass dieses Konstrukt in der Praxis funktionieren wird.

    P.S.: 😕 Du schreibst doch selber bei deinem Artikel, dass das Verhalten undefiniert ist.

    Jah.. Und darum darf es auch ohne Probleme funktionieren. Dass es das tut ist aber nicht garantiert. Undefiniert heisst nicht, dass auch wirklich etwas schlimmes passieren muss (oftmals ist das ja nicht nicht einmal der Fall). Das ist ja das Problem an dem undefiniertem Zeugs. Es stürtzt nicht ab und man bemerkt den Fehler möglicherweise sehr lange nicht bis man den Code mit einem anderen Compiler kompiliert und er da halt etwas anderes macht, als der letzte.



  • Aber wenn braucht man den UNBEDINGT den this Zeiger ?

    Hat jemand dafür vielleicht ein EINFACHES Beispiel.



  • this schrieb:

    Aber wenn braucht man den UNBEDINGT den this Zeiger ?

    Hat jemand dafür vielleicht ein EINFACHES Beispiel.

    void CMyClass::SetI(int i) {
      this->i=i;
    }
    

    Mann kann den Parameter natürlich auch anders nennen, aber egal. Hier sollte für dich ja ersichtlich sein, wieso der this-Zeiger nötig ist. Es gibt ein Klassenmember i und einen lokalen Parameter i in der Funktion. Will man innerhalb der Funktion auf das i der Klasse zugreifen, muss man das explizit per this-Zeiger sagen.



  • this schrieb:

    Aber wenn braucht man den UNBEDINGT den this Zeiger ?

    Hat jemand dafür vielleicht ein EINFACHES Beispiel.

    container.push_back(this);
    


  • CMyClass& CMyClass::blubb (){
      //...
      return *this;
    }
    

    Wird oft für die Ein/Ausgabeoperatoren benutzt.



  • Beim Operatoren Überladen kannst du den Einsatz von this auch beobachten:

    http://magazin.c-plusplus.net/artikel/�berladung von Operatoren in CPlusPlus (Teil 1)


Anmelden zum Antworten