Überladen der Operatoren
-
Hallo ich habe grade ein Verständnisproblem bei dem mit dem Beispiel der Klasse Rational als dem Buch der c++ Programmierer. Und zwar wo muss ich dies deklarieren:
const Rational operator+(const Rational &);Denn da steht noch etwas von globalen Operatoren...
Aber wenn ich die global setze meckert er mir das übliche does not name a type...
Ich hab jedenfalls so versucht...
.. class Rational{ private: long zaehler, nenner; public: Rational(); Rational(long int z, long int n); Rational(const Rational& Bruch); Rational(double zahl); void pruefenenner(); void kuerzen(); void kehrwert(); void negativ(); void ausgabe(); long int getZaehler() const; long int getNenner() const; const Rational operator+(const Rational &); }; ... const Rational operator+(const Rational &a, const Rational &b){ return Rational(a.getZaehler()*b.getNenner()+b.getZaehler()*a.getNenner(),a.getNenner()*b.getNenner()); } int main(){ long int z,n,z2,n2; cout<<"erste Zahl-Zaehler :"<<'\n'; cin>>z; cout<<"erste Zahl-Nenner :"<<'\n'; cin>>n; cout<<"zweite Zahl-Zaehler :"<<'\n'; cin>>z2; cout<<"zweite Zahl-Nenner :"<<'\n'; cin>>n2; Rational a(z,n); Rational b(z2,n2); Rational c; c=a+b; c.ausgabe(); cout<<'\n'; }Bekomme aber den Fehler: Undefined reference to `Rational::operator+(Rational const&)'
-
Namal schrieb:
Bekomme aber den Fehler: Undefined reference to `Rational::operator+(Rational const&)'
Du deklarierst die Memberfunktion "const Rational operator+(const Rational &);", definierst aber die freie Funktion "const Rational operator+(const Rational &a, const Rational &b"
-
Deklariert:
const Rational::Rational operator+(const Rational &);Definiert:
const Rational operator+(const Rational &a, const Rational &b){ return Rational(a.getZaehler()*b.getNenner()+b.getZaehler()*a.getNenner(),a.getNenner()*b.getNenner()); }Übrigens solltest du den Operator (wenn du ihn als Member definierst) konstant machen weil sonst folgender Code nicht funktionieren würde:
const Rational lhs(/*...*/), rhs(/*...*/); Rational Result = lhs + rhs;
-
also hab ich dann die Zeile 24 entfernt und jetzt funktioniert es. Dann muss ich es ganrnicht deklarieren?
-
Du deklarierst und definierst den gewünschten Operator in Zeile 29...
-
MarcoYolo schrieb:
Übrigens solltest du den Operator (wenn du ihn als Member definierst) konstant machen weil sonst folgender Code nicht funktionieren würde
Wenn ich das so machen will, wie muss dann die Definition aussehen?
-
Namal schrieb:
MarcoYolo schrieb:
Übrigens solltest du den Operator (wenn du ihn als Member definierst) konstant machen weil sonst folgender Code nicht funktionieren würde
Wenn ich das so machen will, wie muss dann die Definition aussehen?
const Rational operator+(const Rational &) const;
-
Du kannst den Operator als Member machen:
struct foo { foo operator+ (const foo& rhs) const; };Das
consthier nach der Deklaration bedeutet, dass du die Methode auch von konstanten Instanzen aus aufrufen kannst.Oder als freie Funktion:
struct foo { }; foo operator+ (const foo& lhs, const foo& rhs);
-
Ok, das hab ich jetzt verstanden. Doch wie sieht die Definition der Member dann aus? Bei kehrwert() z.B. ist es ja
void Rational::kehrwert(){ long int temp = zaehler; zaehler = nenner; nenner = temp; kuerzen(); pruefenenner(); }Wie muss die erste Zeile aussehen?
-
Du meinst wohl die Definition der Methoden. Diese stimmt so wie du sie eben geschrieben hast.
-
MarcoYolo schrieb:
Du kannst den Operator als Member machen:
Kann er, sollte er aber normalerweise nicht. Wenn z.B. int implizit in Rational umgewandelt werden kann, funktioniert sowas:
Rational(1,2) + 5, sowas aber nicht:5 + Rational(1,2), weil bei Member-operatoren der erste Operand nicht umgewandelt wird.