Überladung des Operators ++



  • Hallo,

    folgendes Programm:

    #include <iostream>
    using namespace std;
    
    struct Punkt {
    	int x, y; //öffentlich
    
    public:
    
    	Punkt(int xx = 0, int yy = 0) {
    		x = xx;
    		y = yy;
    	}
    	void show(void) {
    		cout << '(' << x << ',' << y << ')' << endl;
    	}
    	Punkt operator++();
    };
    
    Punkt Punkt::operator++() {
    	return Punkt(x++, y++);
    }
    
    int main() {
    	Punkt p1, p2;
    	++p1;
    	p1.show();
    	p2 = ++p1;
    	p1.show();
    	p2.show();
    	return 0;
    }
    

    Wieso wird am Ende (1,1) ausgegeben? Es findet doch eine Zuweisung statt p2 = ++p1;

    Vielen Dank!



  • Weil dein Prefix-++ das macht, was ein Postfix-++ machen sollte. Ein Prefix-++ sollte immer so aussehen:

    Punkt& operator++() {
      // Objekt verändern
    
      return *this;
    }
    


  • Wenn du da auch (2,2) stehen haben willst, solltest du auch ++x und ++y benutzen, nicht postfix++.

    Außerdem sollte der prefix++ operator eine Referenz zurückgeben.



  • Okay, danke euch Beiden



  • #include <iostream>
    
    struct Punkt
    {
    
        int x, y;
    
        Punkt(int xx = 0, int yy = 0) : x(xx), y(yy) //so werden die Variablen mit den Werten initialisiert
        {
        }
    
        void show() //leere Funktionen brauchen kein (void)
        {
            std::cout << '(' << x << ',' << y << ')' << "\n"; //hier brauchst du kein endl, weil es auch einen flush ausführt
        }
    
        Punkt& operator++(); //ohne rückgabe einer Referenz bleibt das Objekt unverändert und nur eine Kopie mit der Value wird übergeben
    };
    
    Punkt& Punkt::operator++()
    {
        x++, y++;
        return *this;
    }
    
    int main()
    {
        using namespace std;
    
        Punkt p1, p2;
        ++p1;
        p1.show(); // (1.1)
        p2 = ++p1;
        p1.show(); // (2.2)
        p2.show(); // (2.2)
    
    }
    

    Schau dir mal diesen Artikel über Operatorüberladung an: http://www.c-plusplus.net/forum/232010-full


Anmelden zum Antworten