Operator << für Komplexe zahlen überladen !
-
Hey Leute bei folgenden Zeilen
Complex c1(1.0 , 2.0); cout << "c1 = " << c1 << endl;soll folgende Ausgabe erfolgen
c1 = 1.0 + 2.0iIch habe also eine Klasse Komplex erzeugt mit den Member varibalen im und re
Und weise diese beiden variablen über den Konstruktor zu ..bla bla ...Jedenfalls wollte ich jetzt den Operator << für die Instanzen der klasse Complex überladen und scheitere daran .. im moment sieht der Code so aus ..
string complex::operator <<(const complex& rhs) { string unite; unite = "KOMPLEXE ZAHL SOLLTE HIER IRGENDWIE VEREINIGT WERDEN"; return unite; }Ich bräuchte mal nen denkanstoß
thx
-
Den operator überlädt man anders. Ich verweis mal aufs Magazin, Ausgabe Januar 2009
Du kannst dann einfach im Operator die nötigen Dinge in den Stream schreiben wie du es normalerweise tust, wenn du die Ausgabe ohne einen selbstgebauten op<< machst.
-
Das sollte in etwa so funktionieren:
std::ostream& operator <<(std::ostream& os, const complex& rhs) { return os << rhs.real() << " + " << rhs.imag() << 'i'; }
-
Nicht .ToString() wie in .net benutzen.
Lieber als complex selber auf den Stream (z.B. cout) schreibem.friend ostream& operator <<(ostream& out,const complex& rhs) { out << rhs.re << " + " << rhs.im << 'i'; return out; }
-
Ad aCTa schrieb:
Das sollte in etwa so funktionieren:
std::ostream& operator <<(std::ostream& os, const complex& rhs) { return os << rhs.real() << " + " << rhs.imag() << 'i'; }Ja, so funktionierts - ist allerdings didaktisch nicht sehr wertvoll, wenn er gleich die Komplettlösung bekommt

-
Noch weniger wertvoll: Die friend-Variante passt besser.
-
Hmm ok , verständlich... und wo genau implemetiere ich das ... ???
eigentlich doch in der Klasse std .. wie erlange Zugriff darauf ??
-
Ad aCTa schrieb:
Noch weniger wertvoll: Die friend-Variante passt besser.
Das ist wiederum Geschmackssache. Mehr oder weniger... Ich hab gelernt, friend so wenig wie möglich zu verwenden, einfach weils die stärkste Kapselungs-Brechstange ist die es überhaupt gibt.
-
Bacid90210 schrieb:
Hmm ok , verständlich... und wo genau implemetiere ich das ... ???
eigentlich doch in der Klasse std .. wie erlange Zugriff darauf ??doppelt falsch:
- std ist ein Namensraum und keine Klasse
- hast du da überhaupt keinen Zugriff drauf sondern solltest den Operator im selben namespace wie die Klasse als freien Operator implementieren (google: argument dependent lookup)- oder in dem namespace in dem du ihn benutzen willst.
-
pumuckl schrieb:
Ad aCTa schrieb:
Noch weniger wertvoll: Die friend-Variante passt besser.
Das ist wiederum Geschmackssache. Mehr oder weniger... Ich hab gelernt, friend so wenig wie möglich zu verwenden, einfach weils die stärkste Kapselungs-Brechstange ist die es überhaupt gibt.
Gilt das auch für meine Lieblinge, die inline-friends wie
class complex { private: double re,im; public: //Konstruktoren und Arithmetik //Und jetzt kommt er: friend ostream& operator <<(ostream& out,const complex& rhs) { return out << rhs.re << " + " << rhs.im << 'i'; } };
-
Warum friend ?
Wiso eine Referenz auf ostream ?? .... das is zu viel für mich ...
Wenn mir einer die erste Zeile nochmal erklären könnte wäre ich ihm echt dankbar
-
volkard schrieb:
Gilt das auch für meine Lieblinge, die inline-friends wie
Ja - für alle friends, die man ohne übermäßige Kosten vermeiden kann... IIRC wars in einem der Sutter-Bücher wo die Delegation an eine normale Methode delegiert wurde, wie ichs auch im Magazinartikel beschrieben hab:
std::ostream& X::outputToStream(std::ostream&) const; std::ostream& operator<<(std::ostream& lhs, X const& rhs) { return rhs.outputToStream(lhs); }
-
Bacid90210 schrieb:
Warum friend ?
Wiso eine Referenz auf ostream ?? .... das is zu viel für mich ...
Wenn mir einer die erste Zeile nochmal erklären könnte wäre ich ihm echt dankbar
http://www.c-plusplus.net/forum/viewtopic-var-t-is-232010-and-start-is-0.html und folgende
-
Bacid90210 schrieb:
Warum friend ?
Wiso eine Referenz auf ostream ?? .... das is zu viel für mich ...
friend für den zugriff auf private Daten, die Referenz auf ostream zurückliefern, damit man
a << b << c << dschreiben kann.
Das steht allerdings beides in jedem Grundlagenbuch und in jedem besseren Tutorial, vielleicht solltest du dich da nochmal einlesen?
-
Ja das werd ich wohl tun müssen ...
Danke erstmal für eure Tipps ...
-
pumuckl schrieb:
volkard schrieb:
Gilt das auch für meine Lieblinge, die inline-friends wie
Ja - für alle friends, die man ohne übermäßige Kosten vermeiden kann... IIRC wars in einem der Sutter-Bücher wo die Delegation an eine normale Methode delegiert wurde, wie ichs auch im Magazinartikel beschrieben hab:
std::ostream& X::outputToStream(std::ostream&) const; std::ostream& operator<<(std::ostream& lhs, X const& rhs) { return rhs.outputToStream(lhs); }Das mache ich eigentlich nur, wenn es sein muß, nämlich wenn outputToStream virtuell kommt.
-
Das sehe ich ähnlich wie du, volkard. pumuckl und ich haben die Thematik schon einmal kurz diskutiert, siehe hier.
Es gibt also durchaus verschiedene Einstellungen gegenüber
friend.