Überladen des ++-Operators



  • Hallo,
    hier ist einmal der Code, bei dem ich ein Verständnisproblem habe:

    #include <iostream>
        #include <string>
        using namespace std;
        class Uno {
                int val;
        public: Uno(int x) { val = x; }
                int out() { return val; }
    
                void operator++(int var) {
                    val += val;
                }
        };
        ostream &operator<<(ostream &o, Uno u)
        {
            return o << u.out();
        }
    
        int main()
        {
                Uno i(2);
                i++;
                cout << i;
                return 0;
        }
    

    Es geht um

    void operator++(int var) {
                    val += val;
                }
    

    Der Inkrement-Operator ++ ist ja ein unärer Operator. Ich verstehe nicht, wieso dann noch ein Parameter var übergeben wird? Ein Parameter bei einer Operatorüberladung kenne ich nur bei binären Operatorenüberladungen. Vorallendingen spielt der Paramater var in der Funktion keine Rolle. Weglassen kann ich den Parameter auch nicht, weil der Compiler dann meckert. Die Fehlermedung bezieht sich dann auf i++.
    Bin da ratlos. 😕


  • Mod

    Der int -Parameter wird nur zu Überladungszwecken (zur Unterscheidung zwischen Post- und Präfix-Inkrement) Verwendet. Das Argument im Aufruf ist einfach 0.



  • Der operator++() macht das ++i, der operator++(int) macht das i++, man fand keine hübsche Lösung, um die beiden tatsächlich unterschiedlichen ++-Operatoren unterschiedlich zu definieren, deswegen dieser Trick.


  • Mod

    keine hübsche Lösung

    Aber vielleicht ein wenig verschünern:

    #define POSTFIX int
    #define PREFIX
    

    ?



  • Arcoth schrieb:

    keine hübsche Lösung

    Aber vielleicht ein wenig verschünern:

    #define POSTFIX int
    #define PREFIX
    

    ?

    Aber erst nach

    #define BEGIN {                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
    #define END }
    

Anmelden zum Antworten