Wie kann ich den << operator in der Klasse definieren



  • Hallo!

    Ich weiß nicht wie man hierfür den <<-operator definiert:

    #include <iostream>
    using namespace std;
    
    class Uber
    {
    	public:
    	Uber(){ value = 0; };
    	Uber(int v){ value = v; };
    
    	Uber operator + (Uber wert); 
    
    	int value;
    
    };
    
    Uber Uber::operator +(Uber wert)
    {
    	return value+wert.value;
    }
    
    int main()
    {
    	Uber wert1(3), wert2(5);
    
    	cout<<wert1+wert2<<endl;
    	return(0);
    }
    

    Hilft mir jemand 🙂 ?



  • #include <iostream> 
    using namespace std; 
    
    class Uber 
    { 
        public: 
        Uber(){ value = 0; }; 
        Uber(int v){ value = v; }; 
    
        Uber operator + (Uber wert); 
    
        int value; 
    
    }; 
    
    ostream& operator<<(ostream& o, const Uber& u) {
       return (o << u.value);
    }
    
    Uber Uber::operator +(Uber wert) 
    { 
        return value+wert.value; 
    } 
    
    int main() { 
        Uber wert1(3), wert2(5); 
    
        cout<<wert1+wert2<<endl; 
        return(0); 
    }
    


  • ostream& operator<<(ostream& o, const Zahl& u) 
    {
       return (o << u.value);
    }
    

    So ganz versteh ich das nicht 🙂
    Zurückgeliefert wird eine Referenz auf einen ostream, angenommen wird eine referenz von einem ostream und ebenfalls die adresse einer instanz der klasse zahl.

    cout<<wert1; sieht dann ungefähr so aus:

    cout(<<, wert1);

    Nur wie darf man sich das " return (o << u.value);" vorstellen?



  • operator^^ schrieb:

    So ganz versteh ich das nicht 🙂

    Dafür gibt es Foren 🙂

    Zurückgeliefert wird eine Referenz auf einen ostream, angenommen wird eine referenz von einem ostream

    Ja

    und ebenfalls die adresse einer instanz der klasse zahl.

    Nein. Der 2. Parameter ist eine konstante Referenz auf Uber. Der &-operator hat mehrere Bedeutungen, abhängig vom Kontext:

    int i;
    int *p;
    p = &i;  // Hier ist & der Adressoperator
    int& r = i;  // Jetzt ist & der Referenzoperator
    

    cout<<wert1; sieht dann ungefähr so aus:
    cout(<<, wert1);

    Nein, so:
    operator<<(cout, wert1);

    Nur wie darf man sich das " return (o << u.value);" vorstellen?

    So (etwas vereinfacht):
    ostream überlädt den operator<< für ints. Dieser operator<< für ints gibt ebenfalls eine Referenz auf den ostream zurück. Es wird also jetzt der operator<< für den int aufgerufen, dieser ausgegeben und ostream als referenz zurückgegeben. Die zurückgegebene Referenz wird dann nochmals zurückgegeben (quasi nur durchgereicht)



  • operator^^ schrieb:

    cout<<wert1; sieht dann ungefähr so aus:
    cout(<<, wert1);

    Nein, eher so:
    operator<<(cout, wert1);
    Nicht cout ist die Funktion, sondern <<.

    Der ostream muss zurückgegeben werden, damit das hier klappt:

    cout << 1 << 2;
    // entspricht (Pseudo-Code):
    <<(<<(cout, 1), 2);
    

    p.s.: public-Variablen verletzen das OCP, mach value lieber private.



  • Besten Dank für die Hilfe! (die klasse war eben nur schnell als beispiel getippt, natürlich werden bestimmte dinge private 🙂 )



  • interpreter schrieb:

    ostream& operator<<(ostream& o, const Uber& u) {
       return (o << u.value);
    }
    

    warum gibst du solche tips?

    es ist doch nicht befürwortenswert, das blauschriftige return durch die klammern aussehen zu lassen wie jede gewöhnliche funktion.

    und dann noch effekt von berechnung nicht zu trennen, obwohl der effekt das wichtige an der funktion ist und die berechneung ganz unwesentlich, kann uch nicht als angemessen gewertet werden.

    ostream& operator<<(ostream& o, const Uber& u) {
       o << u.value;
       return o;
    }
    

    und fall jemand diesen code als besser lesbar einschätzt, dann sagt interpreter bestimmt: ja, der kann kein c++ lesen, sonst würde er meine version hübscher finden.


Anmelden zum Antworten