Operatoren überladen



  • Hallo!

    Ich kenne mich recht gut mit Java aus, bin aber ein totaler Anfänger was C++ angeht.
    In der Uni haben wir ein paar Übungsaufgaben zu C++ erhalten (es geht um Bruchrechnung). Ich bin soweit durchgekommen, habe allerdings Verständnisschwierigkeiten bei den letzten beiden:

    • Schreiben Sie zu der Klasse Operatoren für *= += -= /= und ==.
    • Verwenden Sie die eben implementierten Methoden um freie Operatoren * + - / zu implementieren.

    Ich habe mir dies durchgelesen:
    https://de.wikibooks.org/wiki/C%2B%2B-Programmierung/_Eigene_Datentypen_definieren/_Operatoren_%C3%BCberladen
    http://www.c-plusplus.net/forum/232010-full
    Trotzdem verstehe ich einfach nicht, wozu das Ganze gut sein soll.

    Könnte mir vielleicht jemand helfen?

    Vielen Dank!



  • Die Definition (oder Überladung) von Operatoren in Klassen macht es möglich, Instanzen der Klasse mit Operatoren (anders) zu verwenden. Dies kann Code übersichtlicher machen.
    Ein gutes Beispiel sind Strings. Statt einen String über Klassen-Methode Concat mit einem anderen zusammenzufügen und daraus einen neuen zu erstellen, können beide durch den Operator + auch einfach addiert werden.

    string a = "Hello ", b = "world!";
    //string c = a.Concat();
    string c = a + b;
    

    Sieht besser aus und ist weniger Text.

    Es können auch global Operatoren überladen werden, womit z.B. das Addieren von bekannten Strukturen mit Zahlen möglich gemacht werden könnte.

    Die Erklärungen in deinen verlinkten Tutorials sind eigentlich sehr gut. Nenne genau, was du nicht verstehst.



  • Youka schrieb:

    Nenne genau, was du nicht verstehst.

    Also ehrlichgesagt verstehe ich einfach die Aufgabenstellung nicht:

    • Schreiben Sie zu der Klasse Operatoren für *= += -= /= und ==.
    • Verwenden Sie die eben implementierten Methoden um freie Operatoren * + - / zu implementieren.

    Wie soll ich "zu der Klasse" Operatoren schreiben?
    Wie und warum soll ich "freie Operatoren" implementieren?

    Tut mir leid, ich kann eigentlich programmieren, habe aber im Moment eine Denkblockade...



  • Operatoren zu überladen ist ein Konzept das in Java einfach nicht existiert, die Sprache bietet es nicht an. In C++ kann man Operatoren auf Klassen allerdings Funktionen zuweisen: https://ideone.com/jDJMPM

    struct s { int a; };
    
    s operator + (const s& lhs, const s& rhs)
    {
      s r;
      r.a = lhs.a + rhs.a;
      return r;
    }
    
    int main()
    {
      s a, b;
      a.a = 5;
      b.a = 7;
      s c = a + b;
    }
    

    "Nicht frei" nennt man Überladungen die als Memberfunktion implementiert werden. Die Operatorüberladung von oben wäre z.B. frei - hätte ich den Operator dagegen in der Klasse selbst implementiert, wäre das nicht der Fall. Diese Ausdrucksweise wird in C++ gemeinhin für alle Funktionen verwendet. Eine freie Funktion ist halt einfach keine Memberfunktion. (Auch das existiert in Java nicht.) (main ist z.B. eine freie Funktion.)



  • Dankeschön!

    Ich habe mir jetzt zum Testen etwas zusammengebastelt, erhalte aber folgenden Fehler:

    operators.cpp: In function ‘int main()’:
    operators.cpp: 27:10: error: match for ‘operator<<’ in ‘std::cout << res’

    #include <iostream>
    
    using namespace std;
    
    class Operators{
    
    	private:
    		int num1;
    
    	public:
    		Operators();
    		Operators(int num1){
    			this->num1 = num1;
    		}
    
    		Operators operator+(Operators o){
    			return Operators(num1 + o.num1);
    		}
    
    };
    
    int main(){
    	Operators o1(5);
    	Operators o2(10);
    	Operators res = o1 + o2;
    
    	cout << res; // PROBLEM
    }
    

    Das Problem ist wohl die Ausgabe des Wertes. Wie kriege ich es hin, dass die 15 (5+10) ausgegeben wird?

    Ich weiß, in meinem Fall macht das Überladen wenig Sinn, ich bin num am "Rumspielen".



  • Indem du den Ausgabeoperator überlädst. 😃 Das geht so:

    std::ostream& operator << (std::ostream& stream, const Operators& op)
    {
      stream << op.num1;
      return stream;
    }
    

    Diese Funktion gibst du dann als friend in deiner Klasse an - oder du bietest gleich einen getter für num1 oder machst es public, dann kann man das sofort ausgeben. Wie du willst, das kommt auf den Einzelfall an. Und nach "Initialisierungsliste" solltest du mal googeln, das gibt es in Java auch nicht, sollte man für C++ allerdings unbedingt kennen.


Anmelden zum Antworten