+ operator überladen



  • tipp schau dir operatorn überladnung in den standart libs an z.b. <vector> und is auch meist selbst erklärent

    wert bezieht sich hier auf gar nichts !!
    operator + akzeptier sicha zeiw argumente nur muss du ein neu Betrag erstellen

    Betrag operator+(Betrag& b1, Betrag& b2)
        {
    
            int wert = b1.wert + b2.wert; //kA ob das ein int is
            return Beitrag(wert)
    
        }
    

    operator muss global überschrieben sein oder im namespace

    mfg



  • //edit hab mich verdrückt sry



  • spjoe schrieb:

    Betrag operator+(Betrag& b1, Betrag& b2)
        {
    
            int wert = b1.wert + b2.wert; //kA ob das ein int is
            return Beitrag(wert)
           
        }
    

    So würd ich den aber nicht implementieren.



  • kommt drau an was er mit der klasse erreichen will hab ein bisschen wenig information

    sry für doppelt post

    😉



  • "wert" ist eine float variable. bei mir spielt sich bis jetzt alles in der Klasse selbst ab.

    mit strcmp müsste ich diese beiden strings vergleichen und mithilfe des überladenen operators+ addieren. in den büchern hab ich zig möglichkeiten, aber keine funktioniert so wie ich es will... 😞



  • spjoe: Ich würd ihn auf jeden fall mal friend machen. Wieso hab ich vergessen 😃

    schmitti: Ist dein operator+ in der Headerdatei in der Klasse?



  • schmitti kannst uns mal die Dekleration von deine klasse geben! oda zumindest den teil mit den operator
    mfg



  • so sieht das ganze ding bis jetzt aus:

    class Betrag 
    
    {
    public:
    	float wert;
    	char* bez;
    public:
    
    	Betrag (const Betrag& abc) {
    		wert = abc.wert;
    		strcpy(bez, abc.bez);
    	}
    
    	Betrag operator+(Betrag& b1, Betrag& b2)
    	{
    		wert = b1.wert + b2.wert; 
    	}
    
    }
    


  • #include <iostream>
    
    class Betrag
    
    {
    private:
        float wert;
    	std::string bez;
    public:
    
        Betrag (const Betrag& abc) {
            wert = abc.wert;
    		bez = abc.bez;
        }
    
        friend Betrag& operator+(Betrag& b1, Betrag& b2);
    };
     Betrag& operator+(Betrag& b1, Betrag& b2)
        {
            return Betrag(b1.wert + b2.wert);
        }
    

    nur brauchst da noch nen konstruktor der float akzeptiert !!
    durch friends kannst auch auf privat sachen zugreifen !!

    mfg



  • Wir sind hier im C++-Forum, also benutz besser std::string als char *. float benutzt auch fast keiner, sondern double. Da ich davon ausgehe, dass strcpy() nix mit Speicherallozieren zu tun hat (ist halt C), hast du keinen Speicher für *bez alloziert. Den operator+ würd ich immer noch aus irgendeinem Grund zum friend machen. Dir fehlt ein weiterer Konstruktor (z.B. ohne Parameter), da man so nicht das erste Objekt erstellen kann.



  • spjoe: Öhm, dir fehlt #include <string>, brauchst aber kein #include <iostream>. Hab ich auch ne Zeit lang automatisch gesetzt 😃



  • spjoe schrieb:

    Betrag& operator+(Betrag& b1, Betrag& b2)

    Eine Referenz auf ne lokale Variable? Autsch 🙄



  • habs einfach nur runter gschrieben und eine referenz reicht auch siehe copy konstruktor oben !!!



  • in der klasse definiert, übernimmt der operator+ nur ein argument, wobei der erste summand *this ist. um das zu umgehen, definierst du den op+ außerhalb, eventuell auch als friend, um direkten zugriff auch die member zu haben.

    class Foo
    { 
     public:
        Foo(int i = 0) : i_(i) {}
        friend const Foo operator+ (const Foo& left, const Foo& right);
        int getValue() const {return i_; }
     private:
        int i_;
    };
    /* // ohne friend
    const Foo operator+ (const Foo& left, const Foo& right)
    {
     return left.getValue() + right.getValue();
    }
    */
    const Foo operator+ (const Foo& left, const Foo& right)
    {
     return left.i_ + right.i_;
    }
    

    mfg



  • spjoe schrieb:

    habs einfach nur runter gschrieben und eine referenz reicht auch siehe copy konstruktor oben !!!

    Nicht wirklich.
    Übrigens: Der übermäßige Einsatz von Ausrufezeichen wirkt aggressiv und unseriös 😉



  • spjoe schrieb:

    habs einfach nur runter gschrieben und eine referenz reicht auch siehe copy konstruktor oben !!!

    Redest du mit interpreter? Wenn ja, dann "autsch".



  • sry interprter wollt enich aufdringlich sein will nur helfen hast recht mit den refernce. hab im moment ziemlich viel zu tun. also entschuldige bitte meine fehler



  • spjoe schrieb:

    sry interprter wollt enich aufdringlich sein will nur helfen hast recht mit den refernce. hab im moment ziemlich viel zu tun. also entschuldige bitte meine fehler

    Brauchst dich doch nicht entschuldigen - jeder macht hier Fehler. Das mit den Ausrufezeichen sollte übrigens kein Angriff sein, nur ein nett gemeinter Ratschlag 🙂



  • compiler meckert zwar nicht, aber kann man das so machen: 😕

    public:
    	double wert;
    	std::string bez;
    
    public:
    
    	Betrag();
    	Betrag(double y);
    	Betrag (const Betrag& abc) {
    		wert = abc.wert;
    		bez =abc.bez;
    	}
    
    };		
    	Betrag operator+(Betrag& b1, Betrag& b2)
    	 {
    		double wert = b1.wert + b2.wert; 
    	 }
    


  • du musst was zurück geben im operator

    a = b + c
    

    compiler rechnet zuerst b +c zusammen speicher das ergebnis in tmp variable und gibt es dann a weiter


Anmelden zum Antworten