Probleme beim Überladen des [] Operators



  • Hallo zusammen.
    Ich bastle mir gerade eine eigene String Bibliothek zusammen. Dies funktioniert auch wunderbar und nun wollte ich zur Krönung auch noch den [] Index-Operator überladen.

    Die Syntax:
    char operator [] (const int) const;

    Nun wollte ich das Problem mit einem Frend Operator lösen, aber auch diese Variante funktinierte nicht. Könnt ihr mir eventuel sagen, wie dies zu lösen ist?

    Vielen Dank schon mal im Voraus :xmas1:



  • Oh, Code vergessen.

    char mstring::operator [] (const int index) const
    {
    	return str[index];
    }
    


  • char mstring::operator [] (const int index) const
    {
        return str[index];
    }
    

    der gibt dir auch nur eine kopie von str[index] zurück.
    gib eine referenz zurück, und du wirst glücklich.

    char& mstring::operator [] (int index) 
    {
       return str[index];
    }
    //nicht vergessen, überladung für const
    char mstring::operator [] (int index) const
    {
       return str[index];
    }
    

    musst du halt immer bei char bleiben.



  • als kleine übung mag das gut sein eine string-klasse zu schreiben, allerdings solltest du danach wieder std::string benutzen, da diese lib getestet ist.

    mfg



  • Danke erstmal.
    Also ich kann jedem C++ Lehrling wie mir empfehlen, eine eigene String Klasse zu programmieren. Nun komme ich mit Kopierkonstruktoren und Vererbung wunderbar klar.
    Aber wie mein Vorredner schon gesagt hat, danach lieber die std::string Bibliothek weiterverwenden. 😃

    Grüsse



  • Es ist gut, wenn du Vererbung beherrschst, aber wie kann man die bei einer Stringklasse sinnvoll einsetzen?



  • Indem man String als einen speziellen Container betrachtet, zB abgeleitet von sowas wie std::vector.



  • groovemaster schrieb:

    Indem man String als einen speziellen Container betrachtet, zB abgeleitet von sowas wie std::vector.

    Klingt krank.
    Denn man erbt nicht von value typen.

    die STL zeigt, wie man es macht -> std::stack -> layering



  • Was hindert dich daran, die Basisklasse (also Container Typ) als template Parameter zu übergeben?
    Ich sehe bei der Vererbung sogar Vorteile. So kannst du gleiche Memberfunktionen einfach mit using Deklarationen einbinden, ohne sie neu zu implementieren. Das erhöht Fehleranfälligkeit und Wartbarkeit.



  • groovemaster schrieb:

    Was hindert dich daran, die Basisklasse (also Container Typ) als template Parameter zu übergeben?

    Das value typen idR keine virtuellen Methoden haben?
    Java zeigt es zB wie man es machen kann, wenn alles virtual ist. Ist aber IMHO unfein.

    Erklär mal wie du es in C++ machen würdest und warum dein Ansatz besser ist als der der STL.

    Ich sehe bei der Vererbung sogar Vorteile. So kannst du gleiche Memberfunktionen einfach mit using Deklarationen einbinden, ohne sie neu zu implementieren. Das erhöht Fehleranfälligkeit und Wartbarkeit.

    Äh... Ob ich

    using Base::foo;
    

    oder

    void foo() { Base::foo(); }
    

    schreibe
    ist ja auch schon fast egal.

    allerdings braucht man bei public vererbung idR kein using, folglich redest du von private vererbung? das sollte man nur verwenden, wenn man virtuellen methoden redefinieren will.

    zeig mal bitte ein bisschen code, ich kann mir da nichts vorstellen.

    std::stack zeigt schön, wie man Container wiederverwenden kann, indem man einen Container zum implementieren eines Interfaces verwendet. IMHO ist das eine sehr gute Lösung.



  • Shade Of Mine schrieb:

    Erklär mal wie du es in C++ machen würdest und warum dein Ansatz besser ist als der der STL.

    Hatte eigentlich gehofft, dass du mir ein bissl was erzählst. Hab ja auch nicht behauptet, dass ich einen besseren Ansatz als die STL hab.

    Shade Of Mine schrieb:

    Äh... Ob ich

    using Base::foo;
    

    oder

    void foo() { Base::foo(); }
    

    schreibe
    ist ja auch schon fast egal.

    In deinem Beispiel mag das zutreffen, aber was ist bei Funktionen mit mehreren Parametern oder Funktionen, die mehrfach überladen sind. Das kann dann schnell ausarten.

    Shade Of Mine schrieb:

    allerdings braucht man bei public vererbung idR kein using, folglich redest du von private vererbung?

    Nein, ich rede schon von public Vererbung. Ich dachte aber eigentlich, dass bei Template Klassen, wo die Basisklasse von den Template Parametern abhängig ist, man dann schon explizit using benutzen muss.


Anmelden zum Antworten