Überladen von Operatoren



  • Hallo, ich hätte eine Frage zum Überladen von Operatoren.

    Und zwar habe ich bei einem Programm den == überladen. Jetzt kann ich ihn zum Beispiel mit a == b aufrufen. Wobei a ein Objekt der Klasse ist und b eine double Zahl.
    Ich möchte nun gern den Aufruf auch in umgekehrter Reinfolge durchführen, also b == a.

    Wie könnte ich das am Besten schaffen? Ich dachte mir es könnte eventuell durch eine globale Funktion funktionieren. Jedoch scheiterte ich bei diesem Versuch.
    Wie genau müsste diese Funktion aussehen?

    Es würde mich sehr freuen, wenn mir jemand behilflich sein könnte.
    Falls meine Fragestellung nicht eindeutig ist, oder weitere Fragen aufwirft, stehe ich natürlich zur Verfügung.



  • Wie der operator= als Methode, nur außerhalb der Klasse als freie Funktion und als erstes Argument eine Referenz auf das eigene Objekt angefügt. Damit diese auch auf nicht-öffentliche Member der Klasse zugreifen kann, muss sie in der Klasse als friend deklariert sein. Sieht dann so aus:

    class Dose
    {
    private:
        unsigned int Inhalt;
    public:
        Dose(unsigned intanfang) : Inhalt(anfang) {}
        void trinken(unsigned int menge) { Inhalt -= menge; }
    
        friend bool operator==(const Dose&, const Dose&);
    };
    
    bool operator==(const Dose &lhs, const Dose &rhst)
    {
        return lhs.Inhalt == rhs.Inhalt;
    }
    return
    


  • Ich habe jetzt einmal in meiner Klasse eine Funktion bool operator==(double d), diese kann ich mit c1 == d1 aufrufen, wobei c1 ein Objekt der Klasse ist und d1 eine double Zahl.

    Ich habe jetzt außerhalb der Klasse eine Funktion erstellt: bool operator==(const Complex &, double d), mit dieser möchte ich jetzt den Aufruf d1 == c1 machen, was leider trotzdem nicht funktioniert.



  • Dafür brauchst du dann (zusätzlich) den Operator mit vertauschten Parametern:

    bool operator==(double d, const Complex &)
    

    Eine andere Alternative dazu ist, nur die Memberfunktion

    bool operator==(const Complex &)
    

    (oder eben als freie mit 2 Parametern) zu definieren und zusätzlich dann einen Konstruktor

    Complex(double d)
    

    zu erzeugen.



  • Techel schrieb:

    Wie der operator= als Methode, nur außerhalb der Klasse als freie Funktion und als erstes Argument eine Referenz auf das eigene Objekt angefügt. Damit diese auch auf nicht-öffentliche Member der Klasse zugreifen kann, muss sie in der Klasse als friend deklariert sein. Sieht dann so aus:

    class Dose
    {
    private:
        unsigned int Inhalt;
    public:
        Dose(unsigned intanfang) : Inhalt(anfang) {}
        void trinken(unsigned int menge) { Inhalt -= menge; }
    
        friend bool operator==(const Dose&, const Dose&);
    };
    
    bool operator==(const Dose &lhs, const Dose &rhst)
    {
        return lhs.Inhalt == rhs.Inhalt;
    }
    return
    

    Hahaha, wünderschönes Beispiel. War mir auch nicht bekannt, dass man überladene operatoren als friend deklarieren kann. Wieder mal was dazu gelernt.


Log in to reply