Operator <<
-
Was ist hier falsch das Programm stürtzt aber wenn ich den string v2 ausgeben will.
#include <windows> #include <iostream> #include <vector> using namespace std; ostream& operator <<(ostream &os, string &str ) { return os << str; } int main() { char *v = "abc"; string v2 = "def"; cout<< v <<endl; // funktioniert cout<< v2 <<endl; // crash system("PAUSE"); }
-
Welche Funktion wird denn wohl in Zeile 8 aufgerufen? Richtig, die aus Zeile 6. Den Rest kannst du dir hoffentlich denken.
Dir ist schon klar, dass du gerade die Standardbibliothek nachbaust, oder?
-
Ah, jetzt sehe ich was da falsch läuft das endet iner Endlosschleife und schreibt meinen stream voll bis er überläuft und dann crasht es.
Kann es sein das die Operator überladung nur in Verbindung mit einer Klasse funktioniert?
So funktioniert es jetzt jedenfalls:
#include <iostream> using namespace std; class my_class { public: string var; }; ostream& operator <<(ostream &os, my_class &m ) { return os << m.var; } int main() { my_class my; my.var = "ABC"; cout<<my.var; system("PAUSE"); }
-
oph schrieb:
Ah, jetzt sehe ich was da falsch läuft das endet iner Endlosschleife und schreibt meinen stream voll bis er überläuft und dann crasht es.
Nein, es gibt eine Endlosrekursion, weil der operator<<-Aufruf in der Funktion die Funktion selbst aufruft, und dann einen Stack Overflow.
Kann es sein das die Operator überladung nur in Verbindung mit einer Klasse funktioniert?
Ja.
So funktioniert es jetzt jedenfalls:
Das hat damit aber nichts zu tun. string ist ja schon eine Klasse. Es funktioniert jetzt, weil du in deinem operator<< nicht mehr dieselbe Funktion, sondern die zu std::string gehörige aufrufst. [edit: Und weil du deine Funktion gar nicht aufrufst
Gut gesehen, SeppJ!]Dass Operatorüberladung nur mit Klassen funktioniert äußert sich so, dass es ohne Beteiligung von Klassen Compilerfehler gibt ...
-
oph schrieb:
Kann es sein das die Operator überladung nur in Verbindung mit einer Klasse funktioniert?
Ja. Es macht auch herzlich wenig Sinn, wenn nicht wenigstens einer der beteiligten Typen ein benutzerdefinierter Datentyp ist.
#include <iostream> using namespace std; class my_class { public: string var; }; ostream& operator <<(ostream &os, my_class &m ) { return os << m.var; } int main() { my_class my; my.var = "ABC"; cout<<my.var; system("PAUSE"); }Das macht ganz was anderes als du denkst. Ersetz mal Zeile 13 durch
return os << "Huhu" << m.var;und dann wundere dich.Wenn du mit Operatorüberladung experimentieren möchtest, dann versuch es doch mal mit etwas, das es noch nicht in der Standardbibliothek gibt. Zum Beispiel eine Klasse für Bruchzahlen oder einfache 2D-Vektoren. Da gibt es viele Operatoren mit sinnvollen Überladungen.