Benutzer mit den meisten Antworten
c++ Operator << in Klasse definieren?

Frage
-
Hi,
main.cpp:
[...] cout << v; [...]
Vektor.h:
#include <iostream> using namespace std; [...] public: [...] ostream& operator<<(ostream& ausgabe); [...]
Vektor.cpp
template<typename T> ostream& Vektor<T>::operator<<(ostream& ausgabe) { ausgabe << '('; for (unsigned int position=0; position<v.Groesse(); ++position) { ausgabe << v[position] << ' '; } ausgabe << ')'; return ausgabe; }
ich erhalte in main.cpp folgende Fehlermeldung
D:\DATEN\DATEN\C++\Dummy\test\main.cpp|17|error: no match for 'operator<<' in 'std::cout << v'|
Kann man etwa die Operatorfunktion für << nicht in der Klasse definieren? Oder muss ich noch etwas für die Sichtbarkeit beachten?
Antworten
-
Hallo
Du musst die Reihenfolge beachten.
a << b ruft a::operator<<(b) auf
und
b << a ruft b::operator<<(a) auf
Heisst in deinem Fall, dass cout << v den operator vom 'cout' aufrufen will. Und in der Klasse von cout (nämlich ostream) ist kein operator<<(Vektor) definiert. Daher klappt's nicht. Was du aufrufen könntest wäre hingegen v << cout; ... das würde (weil du den zugehörigen operator<< definiert hast) klappen... sieht natürlich etwas komisch aus dann.
Rudolf
- Als Antwort markiert icekeuter Freitag, 9. November 2012 07:19
Alle Antworten
-
Hallo
Du musst die Reihenfolge beachten.
a << b ruft a::operator<<(b) auf
und
b << a ruft b::operator<<(a) auf
Heisst in deinem Fall, dass cout << v den operator vom 'cout' aufrufen will. Und in der Klasse von cout (nämlich ostream) ist kein operator<<(Vektor) definiert. Daher klappt's nicht. Was du aufrufen könntest wäre hingegen v << cout; ... das würde (weil du den zugehörigen operator<< definiert hast) klappen... sieht natürlich etwas komisch aus dann.
Rudolf
- Als Antwort markiert icekeuter Freitag, 9. November 2012 07:19
-
Ja, richtig... es gibt noch "globale Operatoren". Mit solchen lässt sich das auch machen. Damit kann man sozusagen einen Operator zu einer Klasse hinzudefinieren, ohne die Klasse verändern zu müssen. Allerdings sind nicht ganz alle Typen von Operatoren global definierbar (z.B. Konversion).
Bsp:
class a
{
int b;
bool operator<(int& right) { return b < right; }
};
oder global
bool operator<(const a& left, int& right) { return a.b < right; }
bool operator<(int& left, const a& right) { return right < a.b; }
a object_a;
int q = 12;
if (q < a) // ist nur möglich durch den globalen operator (a < q) liesse sich auch durch den in der Klasse definieren
++q;
Hinweis: den Code hier habe ich nicht geprüft, ist nur hingekritzelt... aber so von der Idee her müsste das stimmen. :-)
Rudolf
-
Diskussion in Zusammenhang: http://www.gutefrage.net/frage/c-operator--in-klasse-definieren
Robert Breitenhofer, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.
-
Hallo zusammen,
Wer noch lesen und testen möchte kann die Dateien unter Beispiele finden: http://www.inf.uni-konstanz.de/algo/lehre/ss01/prad/
http://i11www.iti.uni-karlsruhe.de/_media/information/scripts/sprachen/java2c_.pdf - Seite 43 | Kapitel 8.6 Ein- und Ausgabe
Grüße,
Robert
Robert Breitenhofer, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.