Überladung von Postfix-++



  • Hallo,

    ich bin gerade am Überlegen. Fällt irgendjemandem ein Grund ein, den Postfix-++ Operator in einer Klasse anders zu implementieren als im folgenden Code:

    T operator ++(int)
    {
        T tmp  = this;
        ++this;
        return tmp;
    }
    

    Letztendlich geht es darum, dass dass ich mir überlege, ob es in einer "neuen" Sprache sinnvoll wäre, die Überladung des Postfix-++-Operators überhaupt anzubieten oder ob er immer aus dem Präfix-++ impliziert werden kann.



  • Fällt irgendjemandem ein Grund ein, den Postfix-++ Operator in einer Klasse anders zu implementieren

    Nein, wieso auch?

    Allerdings würd ich ihn doch eher so implementieren:

    T operator ++(int)
    {
        T tmp  = *this;
        ++this;
        return tmp;
    }
    

    😉

    grüße



  • Ich hingegen würde ihn dann doch so implementieren 😃

    T operator ++(int)
    {
        T tmp = *this;
        ++*this;
        return tmp;
    }
    


  • LordJaxom schrieb:

    Ich hingegen würde ihn dann doch so implementieren 😃

    T operator ++(int)
    {
        T tmp = *this;
        ++*this;
        return tmp;
    }
    

    Tatsache... 😮 😉



  • David_pb schrieb:

    Nein, wieso auch?

    Weil ich mich dann darüber wundere, dass die Möglichkeit in C++ überhaupt vorhanden ist. Immerhin musste dazu zu einer IMHO sehr unschönen Krücke gegriffen werden, um durch unterschiedliche Signaturen sicherzustellen, dass die beiden Methoden unterschieden werden können (das wundert mich sowieso, das hätte man schöner lösen können).

    David_pb schrieb:

    Allerdings würd ich ihn doch eher so implementieren:

    Klar. 🙂 Ist mir gestern auch schon aufgefallen aber die Forensoftware hat mich nicht mehr reingelassen um das zu ändern.



  • Glaubst du so Sachen wie
    T temp(*this); ++*this; return temp;

    fallen den Leuten am 1. Tag ein?

    abgesehen davon gibt es natuerlich gruende warum ich das nicht so implementieren will: ich mache kopieren ueber den copyctor. und zwar 2 mal.

    Das ist nicht immer das gewuenschte, zB koennte man Mojo implementieren wollen.

    Oder ganz simpel: einen counter mitlaufen lassen. Oder zB fuer optimierung ein proxy objekt zurueck geben das schaut ob der wert hier ueberhaupt gebraucht wird und ein preinc nicht besser gewesen waere.



  • Shade Of Mine schrieb:

    abgesehen davon gibt es natuerlich gruende warum ich das nicht so implementieren will: ich mache kopieren ueber den copyctor. und zwar 2 mal.

    Nun ja ... Kopie Nummer eins lässt sich aber IMHO nicht vermeiden, wenn man nicht die Semantik verfälschen möchte. D.h. hier ist nicht viel Argumentationsspielraum, hier muss einfach kopiert werden (oder übersehe ich hier etwas?).

    Die zweite Kopie kann leicht vermieden werden, indem der Code ge-inlined wird.

    Letztendlich ging es mir in der Frage ja auch nicht um C++ sondern um eine (fiktive) neue Sprache, in der temporäre Objekte evtl. kein Problem darstellen.

    Oder ganz simpel: einen counter mitlaufen lassen. Oder zB fuer optimierung ein proxy objekt zurueck geben das schaut ob der wert hier ueberhaupt gebraucht wird und ein preinc nicht besser gewesen waere.

    Hmm. Sind das reelle Szenarien? Oder kann man nicht vielmehr annehmen, dass all diese Codes "symmetrisch sind", d.h. dass es reichen würde, sie in Präfix-++ zu implementieren und dann übernehmen zu lassen?

    Blick über den Tellerrand: C# impliziert den Postfix-++-Operator. Allerdings wird hierbei keine Kopie erstellt (die Sprache kennt ja auch keine copycon-Semantik), wenn es sich um eine Klasse handelt (nur bei einer Struct). Vielmehr muss man in der Überladung von Präfix-++ manuell eine Kopie erstellen, wodurch C# eine andere Semantik erhält als C++.
    Dass C# es so macht, reicht mir aber eigentlich nicht aus, denn in der Sprachdefinition wurden Designentscheidungen nicht begründet.

    (Evtl. ist das langsam keine C++-Frage mehr und hat hier nix zu suchen. Tut mir leid.)



  • einen postfix operator automatisch so zu ueberladen wie hier gezeigt, passt schon. Das ist in 99% der faelle genau das was man will.

    ich habe mich eher auf
    "Weil ich mich dann darüber wundere, dass die Möglichkeit in C++ überhaupt vorhanden ist"
    bezogen.


Anmelden zum Antworten