Vergleichs operator, als memeber oder als friend?
-
Ich würde gerne wissen, ob es etwas bringt, wenn ich einen vergleichsoperator
z.B. == als friend funktion implementiere soll, obwohl ich es auch als member funktion implementieren könnte.Mir geht es konkret nur um den Vergleich zweier Objekte vom selben Typ.
Mir ist das bei Qt aufgefallen:
http://qt-project.org/doc/qt-4.8/qsize.html#operator-eq-eq-35Hier könnten sie zumindest den vergleich zweier QSize objekte als member funktion implementieren. Der funktions call würde sogar einen parameter weniger erfordern.
Weiß da jemand bescheid was der Grund dafür sein könnte?
-
Wenn du Zugriff auf private Elemente braucht, für die es keine Getter gibt:
Operatoren als MemberWenn du außerhalb der Klasse auf alle Elemente problemlos zugreifen kannst:
Operatoren als Non-MemberWenn ein Sonderfall vorliegt (siehe z.B. Sid Meyers "Effektiv C++ Programmieren", Auflage 3, Tipp 46 "Definieren Sie bei erforderlichen Typumwandlungen Nichtelementfunktionen innerhalb von Templates"):
Operatoren als befreundete Non-Member
-
Rein prinzipiell ist es in vielen Fällen sinnvoll, Operatoren, wenn möglich, als freie Funktionen zu definieren, z.B. damit implizite Konvertierungen bei binären Operatoren in beiden Argumenten berücksichtigt werden:
class string { // ... public: string(const char*); // ... }; string operator +(const string& a, const string& b) { // ... } string hello("hello"); string world("world"); "hello" + world; // wäre operator + eine member function, würde das nicht funktionieren hello + "world";Im Falle von templates wird man derartige Funktionen, wenn möglich, zusätzlich in einer friend Declaration im template definieren wollen, weil man dort Zugriff auf die Template Parameter hat.
-
Nash26 schrieb:
Ich würde gerne wissen, ob es etwas bringt, wenn ich einen vergleichsoperator
z.B. == als friend funktion implementiere soll, obwohl ich es auch als member funktion implementieren könnte.Das Sollen bringt dir gar nichts.
Nash26 schrieb:
Der funktions call würde sogar einen parameter weniger erfordern.
Die Funktion hat auch dann 2 Parameter.
-
Operatordefinition schrieb:
Wenn du Zugriff auf private Elemente braucht, für die es keine Getter gibt:
Operatoren als MemberOkay da würde bedeuten die von Qt hätten das QSize eigentlich als member operator defklarieren können.
Bleibt die Frage warum sie es doch nicht so gemacht haben?
[quote="camper"]
Nash26 schrieb:
Ich würde gerne wissen, ob es etwas bringt, wenn ich einen vergleichsoperator
z.B. == als friend funktion implementiere soll, obwohl ich es auch als member funktion implementieren könnte.Das Sollen bringt dir gar nichts.
Willst du mir damit sagen es ist völlig egal wie ich es mache?