operatorübeladung? falls a*b gerechnet soll dann rechne a+b



  • hi, also mein problem ist das ich zwei zahlen habe (double) die sollen jetzt aber falls ich a*b im quelltext stehen habe als a+b gerechnet werden. angeblich soll das mit operator überladung gehen, habe auch schon probiert meinen * operator zu "überladen" so dass dann a+b gerechnet wird... allerdings sagt mir der compiler das der operator + (in der operator überladung) nicht definiert ist.
    kann mir jemand sagen ob es mit operator überladung geht und evtl. wie ich das anstelle?! bitte keine tips mit (na dann rechne noch a+b...) denn ich soll später mehrere "verdrehte" operatoren einsetzten können bzw. in einem algorithmus damit rechnen und will/soll den nicht jedesmal umschreiben.

    class komp{double x;};
    komp operator*(komp& a, komp& b)
    {
    return (a+b);
    };
    

    und der fehler den ich bekomme ist:

    error: no match for ‘operator+’ in ‘a + b’
    

    was für mich soviel heisst wie "ich kenne keinen operator + um den operator * zu überladen"...

    mit dank im voraus...



  • Ja, du hast die Frage doch schon selbst beantwortet.
    Bzw. die Fehlermeldung ist relativ eindeutig.
    operator + musst du auch noch überladen, oder du addierst die double's.
    Übrigens Paramterübergabe besser via const reference.
    Außerdem Zugriff auf Membervariable x.
    x muss in den Beispielen public sein, hab deshalb struct statt class genommen.

    struct komp{ double x;};
    komp operator*(const komp& a, const komp& b)
    {
        return (a+b);
    };
    komp operator+(const komp& a, const komp& b)
    {
        return (a.x+b.x);
    };
    

    oder

    struct komp{double x;};
    komp operator*(const komp& a, const komp& b)
    {
    return (a.x+b.x);
    };
    

    Du brauchst wohl eher zweiteres.

    MfG
    DDR-RAM

    edit: dreimal editiert 🙄 🤡



  • hi, danke erstmal aber der + operator soll ja auch "umdefiniert" werden, allerdings soll der * operator dann nicht das "neue" + ausführen... ich hoffe das klingt nicht so verwirrt wie ich gerade bin...



  • das habe ich mir schon gedacht, deshalb variante zwei.



  • Wäre es nicht besser wenn er statt

    DDR-RAM schrieb:

    struct komp{double x;};
    komp operator*(const komp& a, const komp& b){
        return (a.x+b.x);
    };
    
    ....
    return komp(a.x+b.x);
    ....
    

    schreiben würde?

    Gruß Baracke

    PS: Die Operratoren für die Grunddatentypen wie "int", "double" usw. darf man nicht überladen, oder?

    PS2: Warum darf mein (Edit: *hust* man..) kein "fett", "kursiv" usw. direkt in den Code-Tags benützten? Wäre doch praktisch zur besseren Veranschaulichung.

    Edit: Nur das Zitat richtig gestellt ^^



  • danke zum 2.
    ich habe jetzt aber das problem das ich alles mögliche "überladen" muss, z.B. <, >, ... gibts da eine möglichkeit das alle operatoren (ausser die die ich speziell überlade) z.B. von den "double"s übernimmt? also das ich nur noch meine 2 operatoren überlade und die anderen alle das tuen was man gewohnt ist?!

    -mfg-

    edit:
    @baracke
    hey genau das bräuchte ich! operatoren von double überladen dann müsste ich nicht diesen "umweg" nehmen obwohl ich nur mit doubles hantiere!



  • Da muss ich dich leider entäuschen, das war eher eine rhetorische Frage mit dem Überladen. Und selbst wenn es ginge würde ich davon abzuraten, da jegliche Konsistenz gegenüber dem Standard verloren geht. Was Harken in Schiffankergröße nach sich ziehen würde. Die Wartbarkeit wär ein "wenig" betroffen davon, zumindestens wenn es andere Personen machen müssen, mal ganz von der Erweiterbarkeit zu schweigen. Alle Standartfunktionen die deine Operratoren benützten, wären unbrauchbar usw. Zusammengefasst kann man sagen das es keine schlechte Wahl war es so handzuhaben 😉

    Halt dich einfach an DDR-RAM und mach eine Wrapper Klasse (Hüllenklasse) um double und überlade die nötigen Operatoren.
    In etwa so:

    class Double {
    public:
        Double(double val) : value(val) { };
        double getValue() { return value };
        void setValue(double val) { value = val };
        ... // Operratorüberladungen (aber nur für die wo der linke Operant vom Typ Double ist alle anderen global)
    private:
        double val;
    }
    ... // Operatorenüberladungen (siehe oben)
    

    Achja neue Operatoren zu definieren ist auch nicht möglich, sprich zu sagen "/%" errechnet jetzt die Wurzel der Zahl die folgt und dergleichen.

    Gruß Baracke


Anmelden zum Antworten