operator überladen
-
Hallo, ich habe eine Bruch Klasse, die die Variablen zaehler und nenner enthält. Nun möchte ich diese Variablen mit einem Backslash getrennt über cout ausgeben.
BSP:
class RZahl{ long zaehler; long nenner; public: /* Konstruktor */ RZahl(long nZaehler = 0, long nNenner = 1); /* Getter*/ long getZaehler(); /* Getter*/ long getNenner(); void operator << (RZahl& op1); }In Main wird das Objekt erstellt:
RZahl rat(1,2);jetzt möchte ich mit cout << rat; die Augabe 1/2 haben.
Dazu muss ich doch diesen Operator "<<" überladen.
Leider funktioniert es nicht, so wie ich es mache, wie muss denn das richtig aussehen?void RZahl::operator << (RZahl& op1){ cout << op1.getZaehler() << "/"; cout << op1.getNenner() << endl; }EDIT: Hopla habs doch selbst hinbekommen
ostream& operator << (ostream& out, RZahl& op1){ out << op1.getZaehler() << "/" << op1.getNenner(); return out; }Eine Frage hätte ich noch. Warum kann ich diese Methode nicht in der RZahl Klasse definieren? Die Musste extra über der Main Klasse platzieren, damit es geht. Aber ich weiß nicht warum.
-
std::ostream & RZahl::operator << (std::ostream & os, RZahl& op1){ cout << op1.getZaehler() << "/"; cout << op1.getNenner() << endl; return os; }
-
Danke.:)
Warum kann ich eigentlich diese Methode nicht in der RZahl Klasse definieren? Die Musste extra über der Main Klasse platzieren, damit es geht.ostream& operator << (ostream& out, RZahl& op1){ out << op1.getZaehler() << "/" << op1.getNenner(); return out; }
-
rustywing schrieb:
Danke.:)
Warum kann ich eigentlich diese Methode nicht in der RZahl Klasse definieren? Die Musste extra über der Main Klasse platzieren, damit es geht.ostream& operator << (ostream& out, RZahl& op1){ out << op1.getZaehler() << "/" << op1.getNenner(); return out; }Sry, habe ich noch vergessen zu sagen. Das Problem ist, dass das ein 2 stelliger Operator ist. Und wenn du ne Member Funktion überlädst, dann ist der erste Parameter implizit die Klasse. Du willst aber ostream zuerst haben, also musst du eine globale Funktion definieren.
-
wenn du das ganze in die class schreibst dann denkt der compiler du meinst den binären << operator (also diesen komischen bit operator)...
-
Skym0sh0 schrieb:
wenn du das ganze in die class schreibst dann denkt der compiler du meinst den binären << operator (also diesen komischen bit operator)...
Und der Operator, der rechts einen ostream und links ein RZahl stehen hat, ist nicht binär? :p
Nein, drakon hat die Begründung schon genannt.
-
Danke für die Hilfe
-
drakon schrieb:
std::ostream & RZahl::operator << (std::ostream & os, RZahl& op1){ cout << op1.getZaehler() << "/"; cout << op1.getNenner() << endl; return os; }Also prinzipiell sollte man in einem ouput operator nicht std::endl verwenden. Dieser modifizierer hat 2 Aufgaben, die beide hier nicht hin gehören. Zum einen wird eine Zeilenschaltung ausgegeben und das ist nicht das, was man von einem solchen Ausgabeoperator erwartet und zum anderen wird ein flush auf den stream ausgeführt, was nicht Aufgabe des Operators ist.
Und noch was zur Frage: Das Zeichen '/' ist kein Backslash, sondern ein Slash. Ein Backslash ist '\'.
-
sollte man RZahl nicht als const uebergeben ?
Meep Meep
-
Meep Meep schrieb:
sollte man RZahl nicht als const uebergeben ?
Meep Meep
Ja. Das macht man normalerweise so.
Auch was tntnet schreibt ist richtig.
-