Operatorüberladung wiedermal, verständnisproblem
-
huhu
also meine fragen gleich mal:
was ist der unterschied, wenn ich zB vergleichsoperatoren in die klasse mit einem parameter reinschriebe, oder als friend ausserhalb mit 2 parametern?
bsp:
class test { public: bool operator<(const test& Obj) { return data<Obj.data; } friend bool operator<(const test& lhs,const test& rhs); private: int data; }; bool operator<(const test& lhs,const test& rhs) { return lhs.data<rhs.data; };so, eigentlich die selbe frage gilt auch für den + operator (natürlich nicht wenn um eingebaute typen geht, sondern nur um eigene)
gibt es da irgendwelche faustregeln oder so?
-
In deinem Fall ist es relativ egal, ich würde die Deklaration in der Klasse bevorzugen.
Die Variante mit dem friend-Operator ist wichtig, wenn es sich um verschiedene Klassen handelt.
Klasse::operator< wird aufgerufen, wenn der linke Operand ein Objekt der Klasse ist, sonst nicht.
class A {...}; // mit operator< class B {...}; // mit operator< A& a = *new A; B& b = *new B; a < b; // wird zu a.operator < (b); b < a; // wird zu b.operator < (a);Hoffe das ist so richtig und gut erklärt

-
ehrlich gesagt ahb ich es noch nicht so richtig verstanden
-
Nehmen wir an Du willst machen:
Apfel < BirneInnerhalb der Klassen müsstest Du dafür Apfel::operator<(Birne) implementieren. Nehmen wir aber mal an, die Klasse Apfel ist von jemand anderes, Du kannst die nicht ändern. Wasn nu? Dafür ist dann die Variante ausserhalb der Klasse nötig ( global operator<(Apfel, Birne) )
Mal so ganz grob

-
LordJaxom schrieb:
Nehmen wir an Du willst machen:
Apfel < BirneInnerhalb der Klassen müsstest Du dafür Apfel::operator<(Birne) implementieren. Nehmen wir aber mal an, die Klasse Apfel ist von jemand anderes, Du kannst die nicht ändern. Wasn nu? Dafür ist dann die Variante ausserhalb der Klasse nötig ( global operator<(Apfel, Birne) )
Mal so ganz grob

na bisschen wirds

red mal weiter...

achso, also wenn der linke operator ein objekt einer anderen klasse sein soll/kann, muss ich logischerweise ausserhalb, da sonst der erste operator immer this ist....oder?
-
Solange der Wert links vom Operanden deine Klasse ist, ist es egal. Möchtest Du aber den op<< überladen und dieser soll in einen std::ostream schreiben musst Du dafür eine globale Funktion verwenden, da der linke Operand ein std::ostream ist. friend brauchst Du nur, wenn die Funktion auch auf nicht-öffentliche Elemente deiner Klasse zugreifen soll.