Überladen der Operatoren funzt nicht...



  • Hi Leute,

    ich bin ziemlich neu in der C++-Programmierung und hoffe auf disem Wege, mein Wissen über C++ zu erweitern. Ich habe zum Überladen von Operatoren folgenden Code geschrieben. Wenn ich aber meinen Compiler Codeblocks laufen lasse, bekomme ich folgende Fehlermeldung:

    no match for Operator >>....usw.

    Die Fehlermeldung bezieht sich auf die Zeile, in der ich den Fragezeichensmilie reinkopiert habe...

    Irgendjemand eine Idee, was fehlt bzw falsch ist?

    #include <iostream>
    #include <cstdlib>
    using namespace std;

    struct complex

    {
    double re;
    double im;
    };

    complex operator-(const complex&);
    complex operator+(const complex&, const complex&);
    complex operator-(const complex&, const complex&);

    complex operator-(const complex& x)

    {
    complex temp;
    temp.re= -x.re;
    temp.im= -x.im;
    return temp;
    }
    complex operator+(const complex& x, const complex& y)
    {

    complex sum;

    sum.re = x.re + y.re;
    sum.im = x.re + y.re;

    return sum;
    }

    complex operator-(const complex& x, const complex& y)

    {
    complex difference;
    difference.re = x.re - y.re;
    difference.im = y.re - y.re;

    return difference;
    }

    int main(void)

    {
    complex z1,z2,z3,z4,z5;
    cout << "Bitte geben Sie die komplexe Zahl Z1 ein: " << endl;
    cin >> z1; 😕
    cout << "Bitte geben Sie die komplexe Zahl z2 ein: " << endl;
    cin >> z2;
    cout << "z1 = " << z1 << endl << "z2 = " << z2 << endl;
    z3 = -z1;
    cout << "Die komplexe Zahl " << z1 << " mit dem unaeren Operator - umgeändert zu " << z3 << endl;

    z4 = z1 - z2;
    cout << "z4 = z1 - z2 = " << z4 << endl;
    z5 = z1 + z2;
    cout << "Hier ist das Ergebnis der binaere Addition des uberladenen Operators *: " << z5 << endl;
    return 0;
    }

    Viele Grüße, Dalice66



  • erstmal hier:

    #include <iostream>
    #include <cstdlib>
    using namespace std;
    
    struct complex
    {
    	double re;
    	double im;
    };
    
    complex operator-(const complex&);
    complex operator+(const complex&, const complex&);
    complex operator-(const complex&, const complex&);
    
    complex operator-(const complex& x)
    {
    	complex temp;
    	temp.re= -x.re;
    	temp.im= -x.im;
    	return temp;
    }
    complex operator+(const complex& x, const complex& y)
    {
    	complex sum;
    
    	sum.re = x.re + y.re;
    	sum.im = x.re + y.re;
    
    	return sum;
    }
    
    complex operator-(const complex& x, const complex& y)
    {
    	complex difference;
    	difference.re = x.re - y.re;
    	difference.im = y.re - y.re;
    
    	return difference;
    }
    
    int main(void)
    {
    	complex z1,z2,z3,z4,z5;
    	cout << "Bitte geben Sie die komplexe Zahl Z1 ein: " << endl;
    	cin >> z1; :confused:
    	cout << "Bitte geben Sie die komplexe Zahl z2 ein: " << endl;
    	cin >> z2;
    	cout << "z1 = " << z1 << endl << "z2 = " << z2 << endl;
    	z3 = -z1;
    	cout << "Die komplexe Zahl " << z1 << " mit dem unaeren Operator - umgeändert zu " << z3 << endl;
    
    	z4 = z1 - z2;
    	cout << "z4 = z1 - z2 = " << z4 << endl;
    	z5 = z1 + z2;
    	cout << "Hier ist das Ergebnis der binaere Addition des uberladenen Operators *: " << z5 << endl;
    
    	return 0;
    }
    


  • ist doch ganz klar. in zeile 45 und 47 versuchst du eine komplexe zahl einzulesen, in zeile 48, 50, 53 und 55 versuchst du sie auszugeben.

    dafür musst du aber erstmal die operatoren << und >> für cin sowie cout überladen, dann klappt das auch



  • wenn du den operator>> benutzen willst, musst du den natürlich auch zur verfügung stellen...

    C++-Quellcode gehört auch in C++ Tags:

    struct complex
    {
      double real;
      double imag;
    };
    
    #include <iostream>
    
    std::istream& operator>> (std::istream& s, complex& value)
    {
      s >> real >> imag;
      return s;
    }
    
    int main()
    {
      complex c;
      std::cin >> c;
    }
    

    bb



  • Du hast keine Operator >> für deine Complex-Struktur.



  • unskilled schrieb:

    struct complex
    {
      double real;
      double imag;
    };
    
    #include <iostream>
    
    std::istream& operator>> (std::istream& s, complex& value)
    {
      s >> real >> imag;
      return s;
    }
    
    int main()
    {
      complex c;
      std::cin >> c;
    }
    

    Mir schaudert es vor dem Compiler der das fehlerfrei Compiliert 😮 (Edit: hm! dafür gibt's ja 'nen Smilie!)

    std::istream& operator>> (std::istream& s, complex& value)//Wofür hab'n wir bloß diesen Parameter value?
    {
      return s >> value.real >> value.imag;//So is' schöner
    }
    


  • Hacker schrieb:

    unskilled schrieb:

    ...

    huch 😃 sry, natürlich vergessen 😃

    edit: ob man das return auf ne extra zeile schreibt oder nicht, ist wohl geschmackssache. ich mags auf der gleichen zeile nicht so sehr.



  • unskilled schrieb:

    ob man das return auf ne extra zeile schreibt oder nicht, ist wohl geschmackssache. ich mags auf der gleichen zeile nicht so sehr.

    std::istream& operator>> (std::istream& s, complex& value)
    {
      return 
             s >> value.real >> value.imag;
    }
    

    😃 :xmas1:

    Edit: Wenn man noch auf die schlaue idee der Datenkapselung kommt, ist

    friend
    

    dein Freund oder nicht. Lieber setter Methoden, nich'?



  • so ists natürlich keine geschmackssache mehr... boar.



  • Hacker schrieb:

    ist

    friend
    

    dein Freund oder nicht.

    Oder nicht. friend ist niemandes Freund, sondern ein potentiell echt fieser Eindringling 😛
    Aber auch das ist wieder Geschmackssache...



  • pumuckl schrieb:

    Hacker schrieb:

    ist

    friend
    

    dein Freund oder nicht.

    Oder nicht. friend ist niemandes Freund, sondern ein potentiell echt fieser Eindringling 😛
    Aber auch das ist wieder Geschmackssache...

    Hier braucht es weder Setter noch friend. Hier reicht ein quasi funktionaler Ansatz:

    class complex
    {
    public:
        complex(double re = 0.0, double im = 0.0);
        //...
    };
    
    std::istream& operator>> (std::istream& s, complex& value)
    {
        double re = 0;
        double im = 0;
        s >> re >> im;
        value = complex(re, im);
        return s;
    };
    


  • Tachyon schrieb:

    pumuckl schrieb:

    Hacker schrieb:

    ist

    friend
    

    dein Freund oder nicht.

    Oder nicht. friend ist niemandes Freund, sondern ein potentiell echt fieser Eindringling 😛
    Aber auch das ist wieder Geschmackssache...

    Hier braucht es weder Setter noch friend. Hier reicht ein quasi funktionaler Ansatz:

    class complex
    {
    public:
        complex(double re = 0.0, double im = 0.0);
        //...
    };
    
    std::istream& operator>> (std::istream& s, complex& value)
    {
        double re = 0;
        double im = 0;
        s >> re >> im;
        value = complex(re, im);
        return s;
    };
    

    Das ist indirekt ein setter, aber ein Schlechter. Stell dir vor, du resettest ausversehen noch andere Variablen(hier nicht, bei größeren Klassen aber muss was anderes her).



  • Hacker schrieb:

    ...

    Ich zitiere hier mal Penny von BBT...
    WAS?



  • Tachyon schrieb:

    Hacker schrieb:

    ...

    Ich zitiere hier mal Penny von BBT...
    WAS?

    Guck mal, du erstellst ein Objekt und weißt dann dem anderem dieses zu. Solange der keinen zuweisungsoperator mit rvalue-ref. hat, kann das bei größeren Klassen unnötig werden, du könntest auch noch andere Variablen ausversehen zurücksetzen. Was spricht denn gegen einen setter?



  • Also ich verstehe Hackers Post auch nicht.



  • Hacker schrieb:

    Tachyon schrieb:

    Hacker schrieb:

    ...

    Ich zitiere hier mal Penny von BBT...
    WAS?

    Guck mal, du erstellst ein Objekt und weißt dann dem anderem dieses zu. Solange der keinen zuweisungsoperator mit rvalue-ref. hat, kann das bei größeren Klassen unnötig werden. Was spricht denn gegen einen setter?

    Unötiges aufblähen des Interfaces? Guck Dir mal std::complex an...


Anmelden zum Antworten