Pfeiloperator



  • Hallo,
    ich habe mir gerade etwas zur Überladung vom Pfeiloperator durchgelesen. Dort steht geschrieben, dass der Pfeiloperator einen Zeiger zurückgibt.

    template <class T>
    inline T* SmartPointer<T>::operator->() const
       assert(zeigerAufObjekt);
       return zeigerAufObjekt;
    }
    

    Aber dient der Pfeiloperator nicht dazu über einen Zeiger auf Objekte einer Struktur/Klasse zuzugreifen.

    p->objekt=xyz;
    

    Da müsste doch eine Referenz zurückgegeben werden, denn so kann ich doch gar nichts zuweisen.



  • Das geht ja nicht, weil der rechte Operand ( objekt bei dir) des Pfeiloperators kein Ausdruck ist, der einer Funktion übergeben werden kann. Stattdessen funktioniert ein überladener Pfeiloperator so, dass der Pfeiloperator erneut auf das Ergebnis der Operatorfunktion angewendet wird. Und ggf. nochmal. Deshalb gibt man dort einen Zeiger zurück (oder etwas anderes, auf das -> angewendet werden kann)

    Kurz gesagt: A->x bedeutet (A.operator->())->x .



  • Danke das wusste ich noch nicht. Ich dachte ich muss, wenn ich den Pfeiloperator überlade ihn komplett nachbilden.



  • Zum Typenumwandlungsoperator hätte ich auch noch eine Frage:

    template <class T>
    inline T* SmartPointer<T>::operator bool() const {
       return bool(zeigerAufObjekt);
    }
    

    Ist bool() eine Funktion? Oder ist das einfach die Typenumwandlung. Aber wieso dann einen Typenumwandlungsoperator, wenn man in ihm so und so umwandelt?



  • Der Anfänger! schrieb:

    Ist bool() eine Funktion? Oder ist das einfach die Typenumwandlung. Aber wieso dann einen Typenumwandlungsoperator, wenn man in ihm so und so umwandelt?

    Das ist erst mal ein Funktions-Style-Cast. Ich vermeide diese, weil sie relativ wenig Typsicherheit bieten, genauso wie C-Casts (siehe auch hier).

    Warum Pseudo-Rückgabetyp T* ? Konvertierungsoperatoren haben den Rückgabetyp, der nach operator steht.


  • Mod

    Nexus schrieb:

    Warum Pseudo-Rückgabetyp T* ? Konvertierungsoperatoren haben den Rückgabetyp, der nach operator steht.

    Mit anderen Worten: das T* ist dort schlicht syntaktisch falsch und überflüssig.



  • Das T* ist falsch da habe ich mich vertippt. Aber wozu brauche ich den Typenumwandlungsoperator, wenn ich in ihm so und so die Umwandlung normal vornehme?


Anmelden zum Antworten