Basisklasse als Elementinitialisierungsliste



  • Hi,

    ja, mal wieder ein Problem und mal wieder sollte meiner Meinung nach alles compilen, tut es aber nicht 😃

    Diese Klasse:

    class CString : public std::string
    {
    public:
        AGEAPI CString(const std::string &strString);  // not compiled in String.cpp
        AGEAPI CString(const char *pchString);         // ...
    };
    
    CString::CString(const std::string &strString) :
    std::string(strString)
    {}
    
    CString::CString(const char *pchString) :
    std::string(pchString)
    {}
    

    Gibt Fehler: error C2614: 'CString' : Unzulaessige Elementinitialisierung: 'string' ist weder Basis noch Element (2mal natürlich, für jede Elementinitialisierungsliste einmal 😃 )

    ChrisM



  • probier's mal mit std::basic_string<char>

    außerdem ist std::string nicht zum vererben geeignet (kein virtueller dtor)

    [ Dieser Beitrag wurde am 16.04.2003 um 22:40 Uhr von davie editiert. ]



  • Hallo.

    Fuer mich hoert sich das so an, als wenn der Compiler melden wollte, dass std::string kein Element ist.
    Denn im Fall:

    namespace std
    {
    int string;
    }
    
    ctor() : std::string();
    

    ginge es ja auch so...
    Naja, ich weiss jetzt aber nicht genau, wie mans loesen kann.
    this(strString)
    wuerde ich mal ausprobieren.

    MfG MAV



  • @davie: Das macht nix, ich achte schon darauf, nirgens ein CString als std::string zu übergeben 🙂

    @Mis2com: Du kannst mit der Elementinitialisierungsliste die Basisklasse einen Subklasse mit Konstruktorargumenten initialisieren.
    Ich frag mich nur, warums hier net geht, string ist ein typedef auf basic_string<char>, also das kommt aufs gleiche raus und std::string::string(const string&) und std::string::string(const char*) gibts auch!

    ChrisM



  • Probier doch mal explizit std::string::string zu schreiben!
    Ach quatsch...
    Hmmm...
    Also haste das mit this mal probiert? ^^



  • Ja, aber es funktioniert nicht.

    War ja auch klar, ich kann ja schlecht in der Elementinitialisierungsliste gleich den this-Zeiger vom Objekt (den kann man zwar sowieso net verändern, aber egal 😃 ) auf die Adresse von einem std::string setzen (d.h. std::string bräuchte einen operator void*() 🙂 ).

    ChrisM



  • Mist, hab davie's Tipp oben vorhin überlesen und jetzt erst entdeckt!
    Das war's natürlich! 🙂 (mit basic_string<char> statt string gehts)

    Aber warum erkennt der Compiler das typedef nicht?

    ChrisM



  • gcc (3.2) kann's :p 😃

    und bau dir eventuell ein template draus (für char und wchar_t etc)

    [ Dieser Beitrag wurde am 17.04.2003 um 00:08 Uhr von davie editiert. ]



  • Aber warum erkennt der Compiler das typedef nicht?

    Bug im VC 6.0.

    Aber aus welchem Grund erbst du von std::string? std::string hat keine virtuellen Methoden, du kannst also kein Verhalten ändern. std::string hat keine protected-Elemente, du erhälst also kein neues Interface. Vererbung bringt dir also keine Vorteile gegenüber Containment oder noch viel besser gegenüber freien Funktionen. Das einzige was dir Vererbung bringt sind höhere Abhängigkeiten und weniger Tipparbeit.



  • Nein, ich kann einfach z.B. Zahlen einfügen, indem ich den +-Operator überlade oder z.B. später mal spezielle Funktionen zur Serialisierung einfügen.

    Unicode will ich nicht verwenden, weil es einfach für mich verschwendeter Platz ist (normale ASCII-Palette reicht vollkommen aus).

    ChrisM


Anmelden zum Antworten