std::string nachprogrammieren?



  • Hallo,

    Welche Operatoren du überladen musst weisst du ja nun. Als übung sowas wie std::string nachprogrammmieren ok, aber als Ersatz würde ich es nicht probieren. Das Heapmanagement der STL kann man kaum besser machen.



  • Jaja ok, das ist mir eh klar. Und dass man beim CString mit += was dranhängen kann weiß ich auch. Allerdings geht das eben nur 1x, 'CString x = "a" + "b"' schlägt z.B. mit der Fehlermeldung "Zwei Zeiger koennen nicht addiert werden" fehl.

    Aber um die CStrings gehts mir ja gar nicht, was ich nicht checke ist, wie man eben mehrere "a" + i + "c" Verkettungen mit dem operator+ hinkriegt, da op+ ja irgendwie so gemacht wird: str operator+(const str &, const str &) => Da gibts 2 Parameter, wie kann ich damit so eine Kette auflösen?!
    .... ähm.. moment: vielleicht indem die kette von links nach rechts abgearbeitet wird und operator+ dann beim obigen bsp. halt 3x aufgerufen wird..?



  • Hallo,

    das lässt sich lösen in dem nu beim Operator eine Referenz auf das Object zurück gibst.

    const MyClass &MyClass::operator+(const MyClass &c){
       //addition
       return *this;
    }
    


  • ahh ok danke



  • operator+ sollte normalerweise keine Referenz zurückgeben, sondern eine Kopie!

    struct A { A(int = 0) { } A operator+(const A&) const { return A(); } };
    
    const A a1, a2;
    A a3 = a2 + 3 + a1 + 4 + 6;
    
    //a2.operator+(3).operator+(a1).operator+(4).operator+(6);
    
    //oder
    
    struct A { A(int = 0) { } };
    A operator+(const A&, const A&) { return A(); }
    
    const A a1;
    A a2 = 3 + a1 + 5;
    
    //A(3).operator+(a1).operator+(5); //usw.
    


  • cppfan schrieb:

    "Zwei Zeiger koennen nicht addiert werden"

    Ja, weil du Zeiger nicht addieren kannst. und "a" und "b" sind Zeiger und keine Objekte.

    Grundlagen lernen, bitte.



  • prolog schrieb:

    Hallo,

    das lässt sich lösen in dem nu beim Operator eine Referenz auf das Object zurück gibst.

    const MyClass &MyClass::operator+(const MyClass &c){
       //addition
       return *this;
    }
    

    op+ doch bitte nicht als Member!

    Was erwartest Du Dir denn von

    MyIntClass a = 4;
    a+1;
    cout << a;
    

    Doch wohl nicht 5, oder?



  • Jester schrieb:

    op+ doch bitte nicht als Member!

    Warum nicht? Nehmen wir an der ctor ist explicit...



  • Hast Du das Beispiel gelesen?



  • Ja, und weiter? Was macht jetzt dein operator+?



  • Dann versteh's doch bitte noch.
    So wie prolog das beschrieben hatte wird bei

    a+5;

    a verändert. Und das ist vollkommen unerwartet. Also wenn schon, dann ein neues Objekt zurückgeben, keine Referenz. Das bitte nur beim op= oder den op+= und Konsorten.

    So, warum jetzt kein Member?
    Weil dann auf dem linken Parameter keine Konvertierung durchgeführt werden kann.

    Warum sollte denn

    "Hallo"+5; erlaubt sein, aber 5+"Hallo" nicht?

    MfG Jester



  • Irgendwie erzählst du mir nicht Neues, denn das wurde von mir bereits oben gepostet...

    Warum sollte denn

    "Hallo"+5; erlaubt sein, aber 5+"Hallo" nicht?

    macht keinen Sinn, warum sollte ich einen String-Literal mit einem int addieren? Zudem muss beim Überladen von Operatoren, einer der Parameter von Class-Type sein.



  • Es ist so, wenns dich interessiert warum ließ ecp kapitel 23...

    class myclass
    {
        friend myclass operator + (const myclass& lhs, const myclass& rhs);
    };
    
    myclass operator + (const myclass& lhs, const myclass& rhs)
    {
        myclass ret;
        // ret = lhs + rhs
        return(ret);
    }
    

    So schauts aus.

    MfG SideWinder



  • SideWinder schrieb:

    So schauts aus.

    Du auch nicht... 🙄



  • Hallo,

    @alle Nachposter
    Sry habs mit dem Zuweisungsoperator verwechselt.



  • Shlo schrieb:

    SideWinder schrieb:

    So schauts aus.

    Du auch nicht... 🙄

    Warum er kein Member sein soll ist doch irgendwo klar. Nehmen wir an ein CTor ist nicht explicit (ist ja sehr oft der Fall), dann gibts plötzlich Probleme die mit einem globalen op nicht passieren.

    MfG SideWinder



  • gelöscht



  • Shlo schrieb:

    Warum sollte denn

    "Hallo"+5; erlaubt sein, aber 5+"Hallo" nicht?

    macht keinen Sinn, warum sollte ich einen String-Literal mit einem int addieren? Zudem muss beim Überladen von Operatoren, einer der Parameter von Class-Type sein.

    Oh bitte, Hirn einschalten und dann posten. Das war ein Beispiel!
    Stell Dir vor, int würde nach string konvertiert werden...



  • Jester schrieb:

    Oh bitte, Hirn einschalten und dann posten. Das war ein Beispiel!
    Stell Dir vor, int würde nach string konvertiert werden...

    Wozu? Der Code ist doch super.

    Warum sollte man " hallo"+1 rechnen wollen? vielleicht um "hallo" zu erhalten?

    aber der hauptpunkt ist ja (nochmal für die langsameren)

    a+b;
    ist legaler code
    und
    b+a;
    nicht

    finde ich persönlich verwirrend.
    denn mir hat man immer gesagt
    a+b == b+a



  • Shade Of Mine schrieb:

    denn mir hat man immer gesagt
    a+b == b+a

    Dann ist der operator+ für std::string aber falsch...

    ... *sich der allgemeinen Klugscheißerei anschließ* sorry 🤡


Anmelden zum Antworten