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 arguments

    bool 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 her

    bei 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, dass

    cout << 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 fuer cout sondern fuer einen beliebiges std::ostream Objekt).


Anmelden zum Antworten