Operator < überladen
-
Moinsen
Ich habe 2 Fußballteams und möchte gucken wer mehr punkte hat.
Dazu soll der Operand < verwendet werden.
Den rechten Operanden habe ich mit rop.
Auf den linken Operanden wollte ich zugreifen in dem ich einer neuen variable
die Adresse mit "this" gebe.kriege dann diese Fehler meldung raus:
error: 'bool operator<(const CTeam&)' must take exactly two argumentsbool operator <(CTeam const& rop){ CTeam asd=this; int pointsleft=asd....... int pointsright=rop...... if(pointsleft < pointsright){ return false; }
Wie benutze ich den linken Operanden richtig bzw. greife richtig auf ihn zu?
danke und mfg
Klotz
-
PS:
IM UML Diagramm steht:
+operator <(rop:CTeam const&): bool
-
Du kannst den <-Operator entweder als Memberfunktion oder als freie Funktion implementieren.
Bei der Membervariante bekommst hat du nur ein einziges Argument (naemlich die Rechte seite des Operators), die linke Seite bekommst du implizit ueber den 'this' Pointer:
class Team { public: int punktezahl; // ... bool operator<(const Team &rhs) { return punktezahl < rhs.punktezahl; } // ... };
Bei dir sollte die Memberfunktion wohl als
bool CTeam::operator <(CTeam const& rop){
definiert werden.
Bei der Variante mit der freien Funktion bekommst du zwei Argumente, die linke und die rechte Seite, da du bei einen freien Funktion kein (implizites) this Argument bekommst:
class Team { public: int punktezahl; // ... }; bool operator<(const Team &lhs, const Team &rhs) { return lhs.punktezahl < rhs.punktezahl; }
Alles ungetestet
-
Ist der operator< bei dir Member oder eine freie Funktion?
-
Dein operator< darf auch keine freie Funktion sein wenn du mit this den rechten Operanden haben willst. Das muss einen Memberfunktion sein.
-
erstmal danke
Also da bin ich mir nicht so sicher, die Begriffe sind neu für mich.Aufgabe gibt nur ein Argument vor, daher soll es wohl eine Memberfunktion sein.
Die Fehlermeldung sagt an das das zweite Argument fehlt, also wird es wohl als freie Funktion behandelt im Programm.
code wie oben,
header sieht so aus:bool operator <(CTeam const& rop);
Wie lege ich den fest das es eine Memberfunktion ist?
-
sebi707 schrieb:
Dein operator< darf auch keine freie Funktion sein wenn du mit this den rechten Operanden haben willst. Das muss einen Memberfunktion sein.
den rechten operaden habe ich ja als Argument
mit this will ich auf den linken operanden zugreifen, weil die Funktion mir ja sonst nichts anderes anbietet
-
klot schrieb:
Wie lege ich den fest das es eine Memberfunktion ist?
Eine Memberfunktion ist innrhalb der Klasse deklariert
class MyClass { public: void f(double d); // Member } void g (double d); // freie Funktion
-
danke code läuft jetzt.
Also:
nur ein argument-> Memberfunktion -> CTeam:: vor Operator, also quasi wie ne Methode implenmentieren von der syntax herbei zwei wirds immer weggelassen (CTeam::)
z.B. ostream& operator << (ostream& out, CTeam const& rop)richtig so?
-
klot schrieb:
den rechten operaden habe ich ja als Argument
mit this will ich auf den linken operanden zugreifen, weil die Funktion mir ja sonst nichts anderes anbietet
Ja sorry habs erst nach dem Abschicken gesehen und als Gast kann ich das nicht mehr korrigieren.
klot schrieb:
richtig so?
Ja.
-
klot schrieb:
z.B. ostream& operator << (ostream& out, CTeam const& rop)
Genau, denn man kann
operator<<(...)
nicht als Memberfunktion implementieren. Der Grund dafuer ist, dasscout << deinObjekt;
Syntactic Sugar ist fuer
cout.operator<<(deinObjekt);
Das heisst die Funktion wird nicht auf ein Objekt deiner Klasse aufgerufen sondern auf
cout
(dies gilt natuerlich nicht nur fuercout
sondern fuer einen beliebigesstd::ostream
Objekt).