std::string Vererbung



  • Vererbung: String von std::string

    #include <string>
    
    class String : public std::string
    {
    
    };
    
    using std::cout;
    
    int main(void)
    {
    	String Text; // Text("This"); funktioniert auch nicht
    	Text = "this is my text!";
    	return 0;
    }
    

    Compiler - Fehlermeldung:

    debug.cpp: In Funktion »int main()«:
    debug.cpp:14:9: Fehler: keine Übereinstimmung für »operator=« in »Text = "this is my text!"«
    debug.cpp:14:9: Anmerkung: Kandidat ist:
    debug.cpp:4:7: Anmerkung: String& String::operator=(const String&)
    debug.cpp:4:7: Anmerkung:   keine bekannte Umwandlung für Argument 1 von »const char [17]« nach »const String&«
    

    In meinen Vorstellungen müsste der Zuweisungsoperator doch zu erreichen sein? Was mache ich falsch?



  • Es gibt in einer leeren Klasse (bereitgestellt durch den Compiler):
    * Default-Konstruktor
    * Kopier-Konstruktor
    * operator=
    * Destruktor

    Jetzt überleg mal ganz scharf:
    * Gibt es einen String::operator=(char const*)
    * Gibt es einen String::String(char const*)

    Desweiteren ist std::string nicht zum Ableiten gedacht.



  • arghonaut schrieb:

    Desweiteren ist std::string nicht zum Ableiten gedacht.

    Dann ist der weitere Aufwand es gar nicht Wert, danke.



  • Die Frage ist was du damit erreichen willst.
    Statt std::string abzuleiten könntest du auch eine "Wrapperklasse" machen die einen string verwaltet.



  • DarkShadow44 schrieb:

    Die Frage ist was du damit erreichen willst.
    Statt std::string abzuleiten könntest du auch eine "Wrapperklasse" machen die einen string verwaltet.

    Wäre natürlich auch möglich, ist sogar keine so schlechte Idee



  • RussianTux schrieb:

    Wäre natürlich auch möglich, ist sogar keine so schlechte Idee

    Wenn es möglich ist, ist es nie eine schlechte Idee, eine Aggregation einer Vererbung vorzuziehen. Das reduziert die Kopplung, davon abgesehen willst du (hoffentlich) nicht das komplette unsagbar überladene std::string Interface mit dir rumschleppen.



  • Wieso kannst du nicht einfach std::string verwenden und fertig?



  • RussianTux schrieb:

    Wäre natürlich auch möglich, ist sogar keine so schlechte Idee

    Eine noch tollere Idee ist, deine Funktionalität einfach als freie Funktion hinzuzufügen.



  • dot schrieb:

    Wieso kannst du nicht einfach std::string verwenden und fertig?

    Weil es die Funktionalität nicht bietet, und nein, Boost brauche ich nicht!

    Michael E. schrieb:

    RussianTux schrieb:

    Wäre natürlich auch möglich, ist sogar keine so schlechte Idee

    Eine noch tollere Idee ist, deine Funktionalität einfach als freie Funktion hinzuzufügen.

    Klar, sieht nur einbischen "nicht OOP-mäßig" aus, aber ist natürlich ne Lösung, ne Wrapper-Klasse wäre hier ideal, würde wie ein stinknormaler std::string aussehen und trotzdem alle Methoden aufem Interface anbieten



  • RussianTux schrieb:

    dot schrieb:

    Wieso kannst du nicht einfach std::string verwenden und fertig?

    Weil es die Funktionalität nicht bietet, und nein, Boost brauche ich nicht!

    Und um was für Funktionalität geht es da genau?



  • RussianTux schrieb:

    Klar, sieht nur einbischen "nicht OOP-mäßig" aus

    OOP hat rein gar nichts damit zu tun, ob man objekt.funktion() oder funktion(objekt) schreibt. Es ist im Gegenteil sogar die sauberste Lösung. Siehe z.B. http://www.drdobbs.com/184401197



  • RussianTux schrieb:

    Klar, sieht nur einbischen "nicht OOP-mäßig" aus, aber ist natürlich ne Lösung, ne Wrapper-Klasse wäre hier ideal, würde wie ein stinknormaler std::string aussehen und trotzdem alle Methoden aufem Interface anbieten

    Ohne weitere Details zu kennen behaupte ich mal: nein, wäre nicht ideal, wäre einfach nur doof.



  • einfach mal nen besseren string suchen, als den std


Log in to reply