friend oder global?
-
Ich überlade die OPeratoren << und >> in meiner Klasse. In manche Bücher finde ich die operatoren in der Klasse als friend definiert aber außerhal der privat oder public Bereich, oder manche Bucher arbeiten mit einer globalen Funktion
Beispiel:
class complex: { public: complex(double r, double i) { re =r; im = i; } double real() { return re; }; // <= neu double imag() { return im; }; // <= neu private: doube re, im; }; ostream &operator<<(ostream& o, const complex& c) { return o << c.real() << " " << c.imag(); // <= neu: real() + imag() }ODER
class complex: { friend ostream &operator<<(ostream& o, const complex& c) { return o << c.re << " " << c.im; imag() public: complex(double r, double i) { re =r; im = i; } double real() { return re; }; // <= neu double imag() { return im; }; // <= neu private: doube re, im; };Bitte Vorteile und Nachteile enumerieren!
Danke Carmen
}
-
OK ich habe selber eine ANtwort aber ich möchte mehr...
Das ist meine VersionDer Ausgabeoperator muss eine globale Funktion (und keine Methode) sein, sonst könnte man nicht "cout << c;" schreiben.
Der Ausgabeoperator oben funktioniert aber nicht!!
Weil der Ausgabeoperator eine globale Funktion ist, darf er nicht auf die privaten Datenelemente (re, im) zugreifen.Lösung 1: Man deklariert in der Klasse den Ausgabeoperator als "friend"
dann darf er auf die privaten Datenelemente (re, im) zugreifenLösung 2: Man gibt der Klasse Zugriffsfunktionen wie "real()" oder "imag()"
also
-
Lösung 3: Man definiert eine öffentliche Memberfunktion "void print(ostream&);" und ruft diese von operator<< aus auf.
-
Kannst zu ein Beispiel mit COde geben?
-
klar kann ich:
class Test { int value; public: Test(int v=0) : value(v) {} void print(ostream&) const; }; ostream& operator<<(ostream& out,const test& data) { data.print(out); return out; } void Test::print(ostream out) { out<<"Klasse Test: "<<value<<endl; }
-
Dake Cstoll!
Ich hábe es verstanden.Aber der Nachteil ist, dass ich eine neue Funktion nur für Ausgabe definieren muss...es ist nicht ein großer Unterschied Zwischen Lösung 2 und 3 ...Aber es ist eine kreative Lösung..
Danke CarmenPS Ich versuche jetzt ein Smilie einzufügen(Ob es klappt sehen wir gleich)

-
Also ich sehe es als Vorteil an, nur eine Ausgabefunktion statt einem ganzen Paket Zugriffsfunktionen definieren zu müssen

(und außerdem kannst du auf diese Weise auch eine Vererbungshierarchie handhaben - du mußt nur die print()-Methode virtuell deklarieren und jede von "Test" abgeleitete Klasse kann selbst entscheiden, wie sie ausgegeben werden will)
-
so gesehen hast du Recht...

an Vererbung habe ich nicht gedacht. und ich habe auch nicht gedacht, dass klassen sein können, wo man überhaupt nicht nötig hat GET oder SET Funktionen zu definieren.DANKE!
Ich dachte nur ein meine Spezielle Klasse, wo die Zugriffsfunktionen sind sowieso zu definiere ...
CIAO