Problem beim Überladen des << - Operators

Gedanken solltest du dir beim Programmieren immer machen ;)
Aber beim Überladen von Operatoren kannst du die Variablen eigentlich immer per Referenz übergeben.
Anders ist es beim Zurückgeben: Bei operator+() zum Beispiel musst du ein neues Objekt zurückgeben (du kannst in die übergebenen Parameter ja nicht das Ergebnis der Addition speichern). Also bei der Rückgabe solltest du die schon überlegen, was besser ist, bei der Übergabe eigentlich immer Referenz.

Lg
 
Was ich dabei aber ein bisschen ärgerlich finde:

ich kann bei dem Beispiel oben z.B nicht schreiben
Code:
int main() {
     rational r1(2, 5);
     rational r2(3, 5);
     
     rational r3(r1 + r2);
}

, da der Konstruktor eine Referenz erwartet, bei der Addition aber ein Wert zurückgegeben wird :( . Ist aber insgesamt gesehen nicht schlimm, da man auch
Code:
rational r3;
r3 = r1 + r2;
schreiben kann.

Oder gibt es da noch eine andere Möglichkeit, mit der man das umgehen kann?
 
Das angesprochene Poblem ist auf die (älteren) Versionen vom Standart zurückzuführen,
die keine R-Value-Referenzen erlauben/ermöglichen

(L-Value/R-Value: Was bei einer Zuweisung (ohne Op-Überladung) links und rechts stehen kann.
x=y
x kann eine Variable sein
y kann eine Variable oder ein Wert sein
Du übergibst einen Wert, Referenzen gehen aber nur auf dem Compiler benannte Variablen)

Das sollte inzwischen (aufgrund dem neuen C++-Standart ab gcc 4.3) unerstützt werden.
Mal testen...

edit: Also bei mir gehts mit den Rvalues wie erwartet.
 
Was ich dabei aber ein bisschen ärgerlich finde:

ich kann bei dem Beispiel oben z.B nicht schreiben
Code:
int main() {
     rational r1(2, 5);
     rational r2(3, 5);
     
     rational r3(r1 + r2);
}

, da der Konstruktor eine Referenz erwartet,
Du sprichst vom Kopierkonstruktor. Dieser sollte immer eine konstante Referenz übergeben bekommen, das funktioniert dann nämlich auch mit temporären Objekten (also mit deinem Beispiel).

C++:
class rational {
...
public:
  rational(const rational& other);
};

...
rational c(a + b); // OK
. bei der Addition aber ein Wert zurückgegeben wird :( . Ist aber insgesamt gesehen nicht schlimm, da man auch
Code:
rational r3;
r3 = r1 + r2;
schreiben kann.
Das ist natürlich nicht wirklich optimal und bei deinem Code auch gar nicht möglich, da du keinen Standardkonstruktor definiert hast.

Gruß
 
Zurück