-> operator verständnisproblem



  • sry, bin leider bei der forumsuche nicht fündig geworden, und irgendwie hat mir die erläuterung aus kap. 11.10 "The C++ Programming Language" seltsamerweiße gar nichts gebracht 😕 (der fängt da einfach so mit irgendeinem beispiel an, den ich nicht verstehe 😞 ) In der Doku steht auch nur was dazu, wie man das -> ding anwendet.
    Hab mir als beispiel die #include-datei "LIST" angeschaut, aber daraus:

    _Tptr operator->() const {return (&**this); }
     //für iterator definiert
     //_Tptr bedeutet imho einfach T*
    //aber was zum henker ist &**this ??
    

    ...werde ich leider auch nicht schlauer, (vor allem, weil * operator auch schon überladen wurde!!! 😮 )
    => Hilfe, ich raff das nicht!! 🙄

    Deswegen die frage: was gibt das -> ding eigentlich zurück? was ist der rückgabewert von diesem operator? ich kann mir irgendwie nicht vorstellen, dass es einfach einen zeiger zurückgibt, denn sowas würde dem compiler wohl nicht so gut schmecken:

    struct myStruct{
     int a;
    };
    
    myStruct my_struct;
    (&my_struct)a=100; 
    //statt (&my_struct)->a=100; ??? 
    //(&my_struct) ist doch ein pointer!?
    

    wenn mir das jemand einleuchtend erklären würde, wäre ich sehr dankbar! 😮



  • Andrey schrieb:

    Deswegen die frage: was gibt das -> ding eigentlich zurück? was ist der rückgabewert von diesem operator? ich kann mir irgendwie nicht vorstellen, dass es einfach einen zeiger zurückgibt, denn sowas würde dem compiler wohl nicht so gut schmecken:

    doch, einfach einen zeiger.
    wenn man den selbergebauten op-> aufruft, gibt der etwas zurück, worauf man einen op-> aufrufen kann. so können sich beliebig viele op-> verschachteln, ohne daß man was dazu tut. beendet wird die ganze kacke dann, indem ein zeiger zurückgegeben wird, der nen feinen eingebauten op-> hat.

    mit &* meint man die adresse von dem ding, das der op* zurückgibt, also die adresse von dem ding, wo der selbergebaute zerigerersatz "hinzeigt".
    anscheinend ist _Tptr so ein zeigerersatz.
    gesucht ist also die adresse des elements, das man mit **this meinen würde. wobeio *this das objekt ist, das beim aufruf den op-> links vom op steht.
    bei foo->bla(); ist *this ein anderer name für foo.
    foo->bla();
    macht
    foo.operator->()->bla();
    macht
    (foo.operator->())->bla();
    macht // return (&**this);
    (&*foo)->bla();
    jo, genau wie beabsichtigt.
    beachte, daß (&*foo)->bla(); einfach so geht, weil &*foo ein zeiger ist und nen eingebauten op-> hat.



  • so, volkard = du bist der held! 😃
    ich glaub ich habs jetzt verstanden:

    "&**this" bedeutet bei dem iterator also:
    
    (*this)=der gewöhnliche op* liefert die referenz auf den iterator selbst 
    (type: iterator&)
    
    *(*this)=der überladene op* liefert referenz auf den gespeicherten wert T 
    (type: T&)
    
    &(*(*this))=das ist wieder der gewöhnliche adressierungsoperator op&
    der einen stinknormalen zeiger auf T (also type: T* ) liefert,
    und das ist genau das, was der -> operator zurückgeben muss
    

    juhu, endlich hab ichs gecheggt! 🤡 danke volkard 👍


Anmelden zum Antworten