Postfix und präfix operator inkrement/dekremt überschreiben?



  • hallo zusammen

    habe bisher den operator ++ "präfix" überladen.. was auch funktioniert

    void X::operator++(){

    }

    wenn ich nun den ++ "postfix" überladne wie gehts das? was muss ich dabei beachten?

    Gibt es ne gute seite wo alles bzw. as wichtige über operatoren und überladen steht? grüße



  • void X::operator++(){ 
     //se one
    } 
    
    void X::operator++(int){ 
     //se other
    }
    

    Ansonsten hilft die C++ FAQ Lite oft weiter wenn man grundlegende Fragen hat. Einige Dinge sind nicht 100% genau, aber das wichtigste steht da.

    http://www.parashift.com/c++-faq-lite/



  • wird bei dem zweiten operator das (int) als flag verwendet das der compiler es als präfix interprätiert? oder hat das int noch einen anderen sin?



  • Das hat ausschließlich den Zweck der Unterscheidung, und ist einer der Punkte die bei mir auf der Liste "Nicht logisch herleitbar" stehen. Leider wüsste ich jetzt auf Anhieb auch keine Möglichkeit wie dies hätte besser gelöst werden können.

    cu André



  • ok, als ein flag zur unterscheidung:)

    Eine unlogische Anomalie der Syntax also

    hätte man es nicht

    void X::operator++(){
    
    }
    

    und

    void X::++operator(){
    
    }
    

    machen können;) Das war nämlich meine erster versuche ihn zu überladen;)



  • Hätte man möglicherweise, aber das würde vermutlich noch unnatürlicher aussehen (alle anderen Operatoren - auch die einstelligen - werden als 'operator xy()' überladen).



  • asc schrieb:

    Leider wüsste ich jetzt auf Anhieb auch keine Möglichkeit wie dies hätte besser gelöst werden können.

    Indem man einfach auf Postfix-++ verzichtet, die Implementierung davon sieht sowieso immer identisch aus und könnte problemlos vom Compiler generiert werden.



  • Nicht unbedingt 😉 (ja, theoretisch ist T tmp=*this;++*this;return tmp; die wohl beste Variante, die Inkrement-Operatoren konsistent zu halten, aber bestimmt nicht die einzige Möglichkeit, den Post-Inkrement umzusetzen).

    PS: Wenn es um Konsistenz solcher Grund-Operationen geht, kannst du gleich Boost::Operators verwenden 😉


Anmelden zum Antworten