[Gelöst] Probleme beim Überladen von Operatoren



  • Hallo Blaubär!

    Ich weiß nicht! 😃

    Aber ich habs gestern noch ein bisschen verfeinert, was den Stil angeht und habs so gemacht:

    Complex operator+(const Complex& a, const Complex& b){
    
    	Complex Complex_temp(a.get_real()+b.get_real(), a.get_imag()+b.get_imag());
    
    	return Complex_temp;
    }
    
    Complex operator-(const Complex& a, const Complex& b){
    
    	Complex Complex_temp(a.get_real()-b.get_real(), a.get_imag()-b.get_imag());
    
    	return Complex_temp;
    

    Wobei ich deine Lösung auch interessant finde. Werd ich gleich mal ausprobieren.

    Danke. 🙂



  • Ok, danke. Ich habe aber noch eine kleinen Fehler gemacht. Es muss natürlich this->real und this->imaginary heißten.

    MfG



  • Zagatho_zero87 schrieb:

    Wobei ich deine Lösung auch interessant finde. Werd ich gleich mal ausprobieren.

    Und dann liest du noch mal schnell den Beitrag von Nexus.
    Und deine temp-Variablen sind auch, na ja, zumindest Ansichtssache. Zugegeben, für das Kompilat wird das keinen Unterschied machen, aber Übersichtlicher wird das dadurch jetzt nicht gerade, oder? :p



  • Ja übersichtlicher nicht, das stimmt.
    Was gefällt dir besser:
    Dies

    Complex operator-(const Complex& a, const Complex& b){
    
        Complex Complex_temp(a.get_real()-b.get_real(), a.get_imag()-b.get_imag());
    
        return Complex_temp; 
    }
    

    oder das

    Complex operator-(const Complex& a, const Complex& b){
    
        double lokal_imag_1=a.get_imag();
        double lokal_real_1=a.get_real();
        double lokal_imag_2=b.get_imag();
        double lokal_real_2=b.get_real();
    
        Complex Complex_sum(lokal_real_1-lokal_real_2, lokal_imag_1-lokal_imag_2);
    
        return Complex_sum;
    }
    

    Da die Summenbildung Complex_sum(...) ist in beiden Fällen ca. gleich lang. Aber es fallen die lokalen Variablen weg.



  • Beide doof. Diese beiden Varianten würden für mich infrage kommen: (solche lokalen Variablen werden natürlich eh wegoptimiert, das was rauskommt ist also das Gleiche.)

    Complex operator - (const Complex& lhs, const Complex& rhs)
    {
      return Complex(lhs.real() - rhs.real(), lhs.imag() - rhs.imag());
    }
    
    Complex operator - (const Complex& lhs, const Complex& rhs)
    {
      double real = lhs.real() - rhs.real();
      double imag = lhs.imag() - rhs.imag();
      return Complex(real, imag);
    }
    

    Aber da kommen wir doch langsam in einen Stilbereich der kaum noch sachlich diskutiert werden kann, insofern mach halt was dir Spaß macht. 🤡



  • OK diese beiden gefallen mir auch besser 🙂
    Warum ich oft nacht dem Stil frage ist, weil ich mit dem Buch C von A bis Z gelernt habe (ca. 3-4 Monate) und dann auf C++ umgestiegen bin (C++Primer und Die C++ Programmiersprache) und ich IMHO immer noch den Stil von C von A bis Z mitschleppe. 🙄



  • Sehr hilfreicher Thread, danke.
    Jedoch verstehe ich die Operationsüberladung des <<-Operators nicht.

    ostream& operator <<( std::ostream& os, const Vec& data )
    {
    	return os << data.x1;
    }
    

    Warum muss std::ostream& os als Parameter mit dazu? Ich würde mich über eine Erklärung sehr freuen.

    MfG yihaaa



  • yihaaa schrieb:

    Warum muss std::ostream& os als Parameter mit dazu? Ich würde mich über eine Erklärung sehr freuen.

    Weil da reingeschrieben wird? 😉



  • Ja könnte man den auch std::cout direkt da nehmen und den Parameter weglassen?

    MfG



  • yihaaa schrieb:

    Ja könnte man den auch std::cout direkt da nehmen und den Parameter weglassen?

    Warum denn das? schreib eine Funktion print() ohne Parameter, die macht das auch. Der operator<< ist ja eben dafür da, generisch für alle ostreams zu funktionieren, sei es jetzt cout, ein fstream oder was eigenes von ostream abgeleitetes.



  • yihaaa schrieb:

    Ja könnte man den auch std::cout direkt da nehmen und den Parameter weglassen?

    Der operator << braucht eh zwei Operanden, von daher nicht nur nicht sinnvoll, sondern auch unmöglich. 😉


Anmelden zum Antworten