operator+=() Überladung



  • Hi, bitte um Hilfe
    Der überladene Operator gibt falsches Wert?

    Danke
    // TestOper.cpp

    #include <iostream>
    using namespace std;

    class Rational {
    int nume, deno;
    public:
    Rational(){}
    Rational(int num, int den);
    friend Rational operator+(const Rational& , const Rational& );
    Rational& operator+=(const Rational& rat);
    friend ostream& operator<<(std::ostream& os, Rational& r);
    };

    Rational::Rational(int num, int den) : nume(num), deno(den) {}

    ostream& operator<<(std::ostream& os, Rational& r) {
    os << r.nume << "/" << r.deno << endl;
    return os;

    }
    Rational operator+(const Rational& rat1, const Rational& rat2) {
    Rational r;
    r.nume = rat1.nume * rat2.deno + rat2.nume * rat1.deno;
    r.deno = rat1.deno * rat2.deno;
    return r;
    }

    Rational re;

    Rational& Rational::operator+=(const Rational& rat) {
    Rational tmp(*this);

    cout << " tmp vor " << tmp;
    re = tmp + rat;
    cout << " r nach " << re;  //  zeigt 17/12 
    return re;
    

    }

    int main() {
    Rational rat1(2, 3), rat2(3, 4);

    rat1.operator +=( rat2);
    cout << rat1 << endl;      // zeigt 2/3   ?!
    

    }



  • Dein Operator += muss das this-Objekt ändern, nicht eine Kopie machen. Den +-Operator solltest du dagegen mithilfe einer Kopie und Benutzung von += implementieren, nicht andersrum.

    Außerdem sehe ich gerade noch, dass du da eine Variable re nutzt. Wo kommt die her? Weg damit! (und bitte Code formatieren, einfach deinen Beitrag bearbeiten, deinen Code markieren und den </>-Button drücken)

    Edit: schau dir auch mal https://en.cppreference.com/w/cpp/numeric/lcm an, das könnte dir eventuell helfen, nicht ganz so große Nenner zu produzieren.



  • Danke wob, schönen Tag



  • @odalv sagte in operator+=() Überladung:

    Hi, bitte um Hilfe
    Der überladene Operator gibt falsches Wert?

    So ungefähr sieht der Code ordentlich formatiert aus. Warum ist es eigentlich so schwer so banale Dinge auf die Reihe zu bekommen? Weshalb wird dann trotz Aufforderung den Code ordentlich zu formatieren doch nur wieder ein Teil des Codes formatiert?

     // TestOper.cpp
     
    #include <iostream>
    using namespace std;
     
    class Rational {
    	int nume, deno;
    public:
    	Rational(){}
    	Rational(int num, int den);
    	friend Rational operator+(const Rational& , const Rational& );
    	Rational& operator+=(const Rational& rat);
    	friend ostream& operator<<(std::ostream& os, Rational& r);
    };
     
    Rational::Rational(int num, int den) : nume(num), deno(den) {}
     
    ostream& operator<<(std::ostream& os, Rational& r) {
    	os << r.nume << "/" << r.deno << endl;
    	return os;
     
    }
    Rational operator+(const Rational& rat1, const Rational& rat2) {
    	Rational r;
    	r.nume = rat1.nume * rat2.deno + rat2.nume * rat1.deno;
    	r.deno = rat1.deno * rat2.deno;
    	return r;
    }
     
    Rational re;
     
    Rational& Rational::operator+=(const Rational& rat) {
    	Rational tmp(*this);
     	
    	cout << " tmp vor " << tmp;
    	re = tmp + rat;
    	cout << " r nach " << re;  //  zeigt 17/12 
    	return re;
    }
     
    int main() {
     	Rational rat1(2, 3), rat2(3, 4);
     	
    	rat1.operator +=( rat2);
    	cout << rat1 << endl;      // zeigt 2/3   ?!
    
    }
    


  • Sorry *john 0, das nächste mal.....



  • @john-0 sagte in operator+=() Überladung:

    @odalv sagte in operator+=() Überladung:
    So ungefähr sieht der Code ordentlich formatiert aus. Warum ist es eigentlich so schwer so banale Dinge auf die Reihe zu bekommen? Weshalb wird dann trotz Aufforderung den Code ordentlich zu formatieren doch nur wieder ein Teil des Codes formatiert?

    Das frage ich mich auch immer wieder. Mein Vermutung ist, dass oft auf´m Handy geschrieben wird und man da keine oder nur ´ne schlechte Übersicht hat. Für den Umstand, dass dann nie korrekturgelesen wird, habe ich aber keine Erklärung. Spätestens dann sollte man doch sehen, dass das so nicht in Ordnung ist.



  • @DocShoe sagte in operator+=() Überladung:

    Für den Umstand, dass dann nie korrekturgelesen wird, habe ich aber keine Erklärung. Spätestens dann sollte man doch sehen, dass das so nicht in Ordnung ist.

    Was mich daran immer wieder überrascht, da will jemand eine Programmiersprache erlernen und er scheitert bereits daran Code in einem Editorfenster korrekt zu formatieren. Was soll man daraus für Schlüsse ziehen? Die Beherrschung eines Editors gehört zu den Grundfertigkeiten des Programmierens. Niemand muss mehr ed, edlin, o.ä. nutzen, und selbst auf dem SmartPhone ist das Editorfenster komfortabler als diese Editoren.



  • Immer noch besser als ein foto vom bildschirm zu machen, bei imgur hochladen und es "screenshot" zu nennen.



  • @Cardiac sagte in operator+=() Überladung:

    Immer noch besser als ein foto vom bildschirm zu machen, bei imgur hochladen und es "screenshot" zu nennen.

    Nein nein, hier ist die richtige Vorgehensweise:

    • Code im Editor eingeben.
    • Ausdrucken.
    • Ausdruck als Bild einscannen.
    • Bild in Paint öffnen
    • Screenshot machen
    • Screenshot bei imgur hochladen.

    😂😂😂😂


Anmelden zum Antworten