Eigene list<class A>::sort()
-
Moin,
ich habe eine Klasse (class A) die zwei Integer Variablen besitzt.
Ich will mehrere Klassen in einer Liste geordent halten. In der C++ Referenz habe ich gesehen, dass die Methode "sort()" den "<"-Operator benutzt. ALso habe ich den den Operator überladen.Mein Code sieht in etwas wie folgt aus:
list<A> liste; liste.sort();bool operator<(A t1, A t2){ return t1.x < t1.y;}Jedoch bekomme ich vom Compiler die Fehlermeldung, dass der "<"-operator zu viele Parameter besitzt.
Was ist daran falsch?
Viele Grüße
sdy
-
Du vergleichst dein 'this-Objekt' mit einem Parameter,
folglich beötigst du nur einen Parameter...
-
hmm..ich weiß jetzt nicht, wo ich genau das this-objekt mit einem parameter vergleiche.
was ist denn an der Fuktion falsch? oder ist meine generelle denk-/vorgehensweise falsch?
In the first version, taking no parameters, the comparisons are performed using the operator< between the elements being compared.
b.h
#include "a.h" class B{ list<A> liste; bool operator<(A,A); };b.cpp
bool B::operator<(A t1, At 2){ return t1.getX() < t2.getX(); }So in etwa sieht das aus. Klasse A hat zwei Eigenschaften und Klasse B verwaltet die Objekte in der Liste. Ich möchte die Liste nach dem ersten Parameter sortieren lassen. Aber wie?!
Kannst du mir ein Beispil geben, was ich da falsch gemacht habe?
-
sheddy schrieb:
...
b.cppbool B::operator<(A t1, At 2){ return t1.getX() < t2.getX(); }...
Die Liste verwaltet Objekte der Klasse A - insofern sollte der Operator der Klasse A überladen werden und nicht der Klasse B.
-
Hallo sheddy,
s.a. im Artikel im C++ Magazin Überladung von Operatoren in C++ (Teil 1)
-
Alles klar. Gesagt, getan:
error C2804: Binärer Operator '<' hat zu viele Parameter
Code:
a.h
class A{ private: int x; int y; public: bool operator<(A, A); }a.cpp
bool A::operator <(A t1, At 2){ return t1.x< t2.x; }So. Wenn ich nun die in der Klasse B die sort-Funktion der Liste (Membervariable von
aufrufe, dann gibt er mir doe obige Fehlermeldung aus.
Ich weiß wirklich nicht mehr weiter.
-
Der Fehler des Compilers kommt daher, dass Vergleichsoperatoren welche als Member einer Klasse definiert sind nur einen Parameter brauchen. Hier wird ja die Instanz vom Parameter mit der Klasse selbst verglichen (this).
Vergleichsoperatoren mit zwei Parametern müssen freie Funktionen sein.
alsobool operator<(const A& t1, const A& t2){ return t1.getX() < t2.getX(); }oder
bool A::operator<(const A& t1){ return getX() < t1.getX(); }Ich finde die erste Variante besser.
-
Danke Braunstein. Hat funktoniert!

Aber eine Verständnisfrage habe ich dennoch.
Die sort-Funktion des Containers list<> benutzt den "<"-operator. Daher muss ich den überladenen Operator frei von der Klasse machen. Das leuchtet mir irgendwie ein.ABER warum vergleicht er mit sich selbst, wenn ich die Funktion als Memberfunktion der Klasse mache?
Und wieso erhält die Methode nur einen Parameter? (ich denke, die antwort auf die erste frage, beantwortet dann auch die zweite frage.)Wäre wirklich nett, wenn du mir das erklären oder einen Hinweis geben könntest.
MfG
Sdy
-
Denke dir das am besten so, dass bei einer Memberfunktion immer neben den angegebenen Parametern noch this mit übergeben wird (für dich unsichtbar).
Da ein Vergleichsoperator nunmal nur zwei Parameter haben muss, muss in diesem Fall eben mit this verglichen werden.
Lies mal neben den bereits angegebenen Magazin Artikel auch noch das hier durch.
http://www2.math.uni-wuppertal.de/~axel/skripte/oop/oop13_0.html
-
aaah.. ich denke mal das hier wirds sein:
a < b
a.operator<(b)
oder?!
jaja...3. semester irgendwann mal
hätte ich auch selbst drauf kommen können 
danke für die hilfe!!