Operator überladen



  • Hallo, ich bin c++ Anfänger und verschaffe mir gerade einen überblick in das Themengebiet der Klassen bzw Operatoren überladen. Es ist ne ganz einfache und dumme Frage, ich brings trotzdem irgendwie nicht so zu Stande, sodass ich es jetzt wage hier zu fragen. WIE binde ich genau eine Operator überladende Methode in den rest ein??
    Ich hab eine datei a.h:

    class box {
    
        int ecent; 
    
    public:
        box(int ecent=0);
    };
    

    --------------
    Dann die datei die das einbindet:

    #include "a.h"
    #include <iostream>
    using namespace std;
    
    box::box(int ecent){
        this->ecent=ecent;
    }
    

    und die main.. Ausschnitte zumindest aus allem immer, läuft auch alles super. Ich möchte aber nun einen Operator überladen.

    #include <iostream>
    #include "a.cpp"
    using namespace std;
    
    main () {
    
      box a=5,b=2;
    
      return 0;
    }
    

    --------------
    Angenommen möchte ich den Inhalt beider zusammenzählen.
    also in die main:

    cout << a+b;
    

    in die a.cpp

    int box::box operator+(box p){
      return a.ecent+b.ecent;
    }
    

    oder wie genau? was schreibe ich in die a.h Datei um das ganze zu verlinken bzw wie richtig (da das sicherlich falsch ist), um das dann auch aufzunehmen? Wäre über ne Antwort sehr sehr sehr dankbar!!



  • Hi,

    1. Du schreibst in deine Header:

    friend const box operator+(box lhs, box const& rhs);
    

    Das schreibst du in deine Klasse.

    2. Du schreibst in deine cpp-Datei:

    const box operator+(box lhs, box const& rhs)
    {
      lhs.ecent += rhs.ecent;
      return lhs;
    }
    

    Es ist eine freie Funktion und gehört nicht zu deiner Klasse.

    3. In der main.cpp kannst du dann schreiben:

    box a = 5;
    box b = 2;
    box c = a+b;
    

    cout << c kannst du nicht machen, da du den Ausgabeoperator nicht überladen hast.



  • DANKE! Das funktioniert super. Ausgabe is klar.

    Nicht notwendig, aber bevor ich wieder länger dran sitz was für dich ne Zeile antwort is... wie mach ich das dann ohne friend? Bzw. ist das jz eine art globale Funktion?

    Gibt ja auch das ganze irgendwie als globale Methode, oder falls es das bereits in einer anderen Form is, etwas anders..

    box operator+(box b);
    

    im header weil das iwie dann eine Art a.operator+(b) ist oder so... Das hab ich die ganze Zeit probiert und nicht geschafft...



  • BLACKMAILER schrieb:

    DANKE! Das funktioniert super. Ausgabe is klar.

    Nicht notwendig, aber bevor ich wieder länger dran sitz was für dich ne Zeile antwort is... wie mach ich das dann ohne friend? Bzw. ist das jz eine art globale Funktion?

    Gibt ja auch das ganze irgendwie als globale Methode, oder falls es das bereits in einer anderen Form is, etwas anders..

    box operator+(box b);
    

    im header weil das iwie dann eine Art a.operator+(b) ist oder so... Das hab ich die ganze Zeit probiert und nicht geschafft...

    Das Problem ist, wenn du das als Member machst, hast du keine Typumwandlung im ersten Argument.
    Als freie Funktion ist das möglich: some_box + 5 und 2 + some_box
    Als Member ist nur das möglich: some_box + 2, aber nicht umgekehrt.
    Deklaration und Definition folgen hierbei dem selben Schema:
    Deklaration:
    ReturnTyp Name(ArgumentTyp)
    Definition:
    ReturnTyp Class::Name(ArgumentTyp)
    Name ist in deinem Fall operator+



  • BLACKMAILER schrieb:

    Nicht notwendig, aber bevor ich wieder länger dran sitz was für dich ne Zeile antwort is... wie mach ich das dann ohne friend? Bzw. ist das jz eine art globale Funktion?

    Ja. Wenn du es ohne friend haben willst, musst du der Klasse eine Methode set_ecent() und get_ecent() verpassen, und die dann bei lhs.ecent += rhs.ecent; verwenden, weil du keinen Zugriff mehr auf ecent hast, weil du ja kein Freund mehr bist.

    BLACKMAILER schrieb:

    box operator+(box b);
    

    im header weil das iwie dann eine Art a.operator+(b) ist oder so... Das hab ich die ganze Zeit probiert und nicht geschafft...

    Das macht kein Sinn. Wenn du a+b machst, soll ja a nicht verändert werden.



  • BLACKMAILER schrieb:

    box operator+(box b);
    

    im header weil das iwie dann eine Art a.operator+(b) ist oder so... Das hab ich die ganze Zeit probiert und nicht geschafft...

    Als Memberfunktion:

    // box.h
    
    class box
    {
    ...
        box operator +(const box& rhs) const;
    };
    
    // box.cpp
    
    box box::operator +(const box& rhs) const
    {
        return box(ecent + rhs.ecent);
    }
    

    - osdt



  • Danke! Funkt jz alles und alles verstanden! Danke danke


Anmelden zum Antworten