Kurze Frage zu Operatorüberladung
-
Ich habe 2 Versionen gesehen, den + Operator zu überladen:
Klasse operator+(const int&) const;Klasse operator+(const Klasse&, const int&);Sind beide Versionen gleichwertig oder gibt es da irgendwelche Unterschiede?
-
Es gibt Unterschiede:
Die erste Version ist der Klassen-eigene + Operator (d.h. Memberfunktion), die zweite Version ist ein (für diese Klasse) überladener globaler + Operator (d.h. freie Funktion).
Für binäre Operatoren wird die zweite Variante empfohlen, da du über eine weitere Überladung eine veränderte Reihenfolge der Parameter erlauben kannst, also Klasse+x sowie x+Klasse.
Die erste Version lässt dies nicht zu, hier muss immer ein Objekt der Klasse links stehen.
-
Wie ist denn die "normale" vorgehensweise, wenn ich die Objekt meiner Klasse kompatibel mit anderen Objekten machen möchte?
Im Moment löse ich das so
class Klasse { private: int a; public: Klasse operator+(const Klasse&) const; template<typename T> Klasse operator+(const T&) const; template<typename T> friend Klasse operator + (const T&, const Klasse&); }; Klasse Klasse::operator+(const Klasse&) const { //... } template<typename T> Klasse Klasse::operator+(const T&) const { //... } template<typename T> Klasse operator + (const T&, const Klasse&) { //.... }Ist das (vom Prinzip her) der richtige Stil?
-
Meistens macht man es so:
class MyClass { // ... public: MyClass& operator +=(MyClass const& rhs); template<typename ValueT> MyClass& operator +=(ValueT const& val); // ... }; MyClass& MyClass::operator +=(MyClass const& rhs) { // ... } template<typename ValueT> MyClass& MyClass::operator +=(ValueT const& val) { // ... } MyClass operator +(MyClass const& lhs, MyClass const& rhs) { MyClass copy(lhs); copy += rhs; return copy; } template<typename ValueT> MyClass operator +(MyClass const& lhs, ValueT const& rhs) { MyClass copy(lhs); copy += rhs; return copy; } // usw.Also Zuweisungen in die Klasse rein, die Operatoren aus der Klasse raus und dann meistens über die Zuweisung realisieren.
Grüssli
-
*hust*
Ich darf auf den enstprechenden Artikel zur Operatorüberladung im Magazin verweisen *fg*
-
Fein gemacht Pumukl, aber das *hust war nicht angebracht, zurück ins Körbchen...
-
pumuckl schrieb:
*hust*
Ich darf auf den enstprechenden Artikel zur Operatorüberladung im Magazin verweisen *fg*
Hmmm, stimmt, da hat ja so ein seltsamer Typ vor kurzem einen ziemlich guten Artikel geschrieben. Ganz vergessen

Grüssli