Eigener <<-Operator



  • Hallo,

    ich habe wieder ein kleines Problem. Und zwar sollen für eine eigene Klasse Complex eigene Operatoren geschrieben werden. Mein +-Operator sieht wie folgt aus:

    Complex Complex::operator+(const Complex& c) const
    {
    	return Complex(this->re + c.re, this->im + c.im);
    }
    

    Den <<-Operator für die Ausgabe mit cout habe ich so geschrieben:

    ostream& operator<<(ostream& os, Complex& c)
    {
    	os << c.getRealPart() << " + " << c.getImagPart() << "i";
    	return os;
    }
    

    Nun habe ich ein Problem bei der Ausgabe über cout:

    Complex c1(1.0, 0.0);
    Complex c2(0.0, 1.0);
    cout << "c1 = " << c1 << endl;
    cout << "c2 = " << c2 << endl;
    cout << "Summe: " << c1+c2 << endl;
    

    Bei der letzten Zeile wird ein Fehler gemeldet, weil anscheinend kein passender Operator existiert. Dabei liefert c1+c2 doch eine Complex-Objekt und in den Zeilen darüber funktioniert es. Wo liegt hier mein Fehler? 😕


  • Mod

    Const-Correctness beachten! Dein Ausgabeoperator zeigt durch das fehlende const an, dass er c verändern möchte. Will er aber gar nicht! Der temporäre Wert c1+c2 ist aber unveränderlich. Nun kann der Compiler keine passende Funktion finden für ostreams und unveränderliche Complex.

    PS: Zweiseitige Operatoren wie + implementiert man üblicherweise als freie Funktionen. Denn dann werden eventuelle implizite Umwandlungen auf beiden Seiten gleichberechtigt durchgeführt. Wenn man sie als Memberfunktion implementiert, dann wird nur die rechte Seite implizit umgewandelt. Wenn du beispielsweise eine implizite Umwandlung von reellen Zahlen nach Complex hast (was Sinn machen würde), dann würde derzeit gelten:

    double r;
    Complex c;
    c + r;  // geht
    r + c; // geht nicht
    

    Wenn du das + als

    Complex operator+(const Complex &lhs, const Complex &rhs);
    

    implementierst, dann ginge beides. Weiterhin implementiert man + oft mittels +=, da man dann nur einmal die "wirkliche" Rechnung schreiben braucht und sich nicht wiederholt. Man kann sogar so weit gehen, die ganzen zweiseitigen Operatoren einmalig generisch in einer Library zu definieren und diese dann jedes Mal zu nutzen. Und da das schon einmal jemand gemacht hat, braucht man das auch gar nicht selber zu machen. Wir haben hier einen schönen Artikel im Forum dazu, den ich aber erst suchen muss.
    PPS: Hier:
    Artikel darüber, wie und warum man die Operatoren üblicherweise implementiert
    https://www.c-plusplus.net/forum/topic/232010/überladung-von-operatoren-in-c-teil-1
    Fortsetzung, zu der generischen Library, die ich erwähnte. Habe ich aber zugegebenermaßen noch nie benutzt, da man praktisch niemals außerhalb von Übungsaufgaben eigene arithmetische Typen definiert.
    https://www.c-plusplus.net/forum/topic/240706/überladung-von-operatoren-in-c-teil-2-einführung-in-boost-operators
    https://www.c-plusplus.net/forum/topic/242944/überladung-von-operatoren-in-c-teil-3-boost-operators-für-fortgeschrittene



  • Danke. Ich habe jetzt mal das const beim +-Operator weggelassen, aber dann funktioniert es immer noch nicht. Ich lese mir mal den Artikel durch. Vielleicht fällt mir dann mein Fehler auf 🙂


  • Mod

    Häh? Wer sagt was von weglassen? Du hast zuwenige!



  • Stimmt. Jetzt funktioniert alles wie es soll. Deine Links haben auch nochmal meine Unklarheiten beseitigt. Besten Dank! 🙂


Anmelden zum Antworten