Operatorüberladung wiedermal, verständnisproblem



  • huhu

    also meine fragen gleich mal:

    was ist der unterschied, wenn ich zB vergleichsoperatoren in die klasse mit einem parameter reinschriebe, oder als friend ausserhalb mit 2 parametern?

    bsp:

    class test
    {
      public:
      bool operator<(const test& Obj)
      {
        return data<Obj.data;
      }
      friend bool operator<(const test& lhs,const test& rhs);
      private:
      int data;
    };
    
    bool operator<(const test& lhs,const test& rhs)
    {
     return lhs.data<rhs.data;
    };
    

    so, eigentlich die selbe frage gilt auch für den + operator (natürlich nicht wenn um eingebaute typen geht, sondern nur um eigene)

    gibt es da irgendwelche faustregeln oder so?



  • In deinem Fall ist es relativ egal, ich würde die Deklaration in der Klasse bevorzugen.

    Die Variante mit dem friend-Operator ist wichtig, wenn es sich um verschiedene Klassen handelt.

    Klasse::operator< wird aufgerufen, wenn der linke Operand ein Objekt der Klasse ist, sonst nicht.

    class A {...}; // mit operator<
    class B {...}; // mit operator<
    
    A& a = *new A;
    B& b = *new B;
    
    a < b; // wird zu  a.operator < (b);
    b < a; // wird zu  b.operator < (a);
    

    Hoffe das ist so richtig und gut erklärt 🙂



  • ehrlich gesagt ahb ich es noch nicht so richtig verstanden



  • Nehmen wir an Du willst machen:

    Apfel < Birne
    

    Innerhalb der Klassen müsstest Du dafür Apfel::operator<(Birne) implementieren. Nehmen wir aber mal an, die Klasse Apfel ist von jemand anderes, Du kannst die nicht ändern. Wasn nu? Dafür ist dann die Variante ausserhalb der Klasse nötig ( global operator<(Apfel, Birne) )

    Mal so ganz grob 😉



  • LordJaxom schrieb:

    Nehmen wir an Du willst machen:

    Apfel < Birne
    

    Innerhalb der Klassen müsstest Du dafür Apfel::operator<(Birne) implementieren. Nehmen wir aber mal an, die Klasse Apfel ist von jemand anderes, Du kannst die nicht ändern. Wasn nu? Dafür ist dann die Variante ausserhalb der Klasse nötig ( global operator<(Apfel, Birne) )

    Mal so ganz grob 😉

    na bisschen wirds 🙂

    red mal weiter... 🙂

    achso, also wenn der linke operator ein objekt einer anderen klasse sein soll/kann, muss ich logischerweise ausserhalb, da sonst der erste operator immer this ist....oder?



  • Solange der Wert links vom Operanden deine Klasse ist, ist es egal. Möchtest Du aber den op<< überladen und dieser soll in einen std::ostream schreiben musst Du dafür eine globale Funktion verwenden, da der linke Operand ein std::ostream ist. friend brauchst Du nur, wenn die Funktion auch auf nicht-öffentliche Elemente deiner Klasse zugreifen soll.


Anmelden zum Antworten