operator ++

Rene42

Erfahrenes Mitglied
Hallo,

irgendwie schnall ich es nicht und das wo ich den Code schon 2 Tage anstarre. Also muss ich eure Hilfe für eine eigentlich leichte Überladung eines Operators erbitten.

Kurze Klasse um mich ein wenig mit C++ vertraut zu machen:
Code:
class Datum 

{

 private:
 
  //Hinzufügen (hiermit wird die Addition und Subtraktion realisiert)
 Datum Add(int);

 public:

 int Tag = 22;
 int Monat = 9;
 int Jahr =1986;

 friend Datum operator +=(Datum, int);
 friend Datum operator ++(Datum, int);

};

Datum operator ++(Datum, int);

In der Quellcode Datei wie folgt:

Code:
Datum Datum::Add(int i) { Tag += i; return *this;}

Datum operator +=(Datum DT, int i) { DT.Add(i); return DT;}
Datum operator ++(Datum DT, int i) { DT.Add(1); return DT;}

Das funktioniert in der Main perfekt
Code:
 Datum Test; Test +=1;
während
Code:
 Datum Test; Test ++;
Test ohne Veränderung ausgibt. Bin gerade ratlos....

PS: Wie mache kriege ich es eigentlich hin, dass der gepostet Text schön gehighlightet wird?
 
PS: Wie mache kriege ich es eigentlich hin, dass der gepostet Text schön gehighlightet wird?
Codetags sind schon richtig, aber du musst statt [code][/code][noparse] einfach die Sprache mit angeben, entweder C oder C++ (c hat ein bisschen ein aggressiveres highlighting): [noparse][code=cpp][/code]

Das funktioniert in der Main perfekt [...] während [...] Test ohne Veränderung ausgibt.
Könntest du die main dann auch noch hinschreiben? Ich sehe zwar ein paar Probleme, aber die würden, soweit ich das sehe, nicht alles erklären.

Also dann:
Zum einen: Natürlich kannst du den operator++(int) auch als friend operator haben, aber warum packst du ihn nicht direkt in die Klasse? Oder anders ausgedrückt: Ist das zu Übungszwecken absichtlich so?
Alle deine Friend-Operators haben ein grosses Problem: Du übergibst immer nur eine Kopie der Objekte.
Von operator++(int) (anders als operator++()) erwartet man ja, dass er das Objekt verändert, aber das alte als Kopie zurückgibt.
z.B.:
C++:
int i = 0;
int j = i++;
//i == 1, j == 0

Bei dir passiert aber folgendes:
C++:
Datum a;
Datum b = a++; //a wird Kopiert, dann wird die Kopie verändert, dann wird das Veränderte nochmals kopiert:
//a ist unverändert, b ist a.Add(i), also genau umgekehrt

Allerdings erklärt das nicht, warum der operator+= dann funktioniert.

Ahja, um nicht zu kopieren: Nimm den Referenz-Operator &.

Gruss
cwriter
 
Ich bedanke mich vielmals für die schnelle und nette Hilfe.

Nochmal mit deinen Worten was ich schon zig mal bei Google gelesen habe hat mir nun doch weitergeholfen. Das mit den fehlenden Referenzen war Unwissenheit den Hinweis nehmen ich gerne.

Eigentlich sind die Operatoren in der Klasse wollte nur mal den Unterschied ausprobieren...also ja zu Übungszwecken.
 
Zurück