Ctor bei basic_string<char> und operator+
-
Eeeeeeeinen guten Abend wünsche ich erstmal ^^
Ich hatte gerade ein Problem bei einer Implementierung einer eigenen String-Klasse, dass ich nicht ganz verstehe, und vielleicht kann mir hier der ein oder andere einen Hinweis geben, warum ich dieses Problem hatte. Prinzipiell ist meine Klasse ein simpler std::string den ich um einpaar Funktionen erweitern will. Die Definition sieht wie folgt aus:
typedef C_STRING_T : public std::string { // [...] }String_t;Was ich normalerweise bei einem std::string immer gern verwendet habe, war die Möglichkeit diverse const char* und andere std::string mit dem passenden Ctor zu verknüpfen um daraus einen neuen String zu schaffen, wie folgt:
std::string strWelt = "Welt"; std::string strNeu = std::string("Hallo " + strWelt);Versuche ich dieses Stück Code mit einem String vom Typ meiner Klasse zu verwenden,
String_t strWelt = "Welt"; String_t strNeu = String_t("Hallo " + strWelt);meckert der Compiler das Fehlen eines passenden Ctor an. Das liegt einzig und allein an dem const char*, denn wenn ich LHS und RHS bei der "+"-Operation vertausche, geht's (die jeweiligen Operatoren sind implementiert).
Folgende Ctor's habe ich definiert:
explicit C_STRING_T(void); C_STRING_T(const C_STRING_T& str); C_STRING_T(const C_STRING_T& str, size_t pos, size_t n = npos); C_STRING_T(const char* s, size_t n); C_STRING_T(const char* s); C_STRING_T(size_t n, char c);Der Ctor der mir fehlt, und nach dessen Implementierung der Code compiled wird, ist
C_STRING_T(const std::string& str);So.... jetzt versteh' ich leider nicht ganz, warum der Compiler genau diesen braucht. Wieso wird in beiden Fällen der const char[6] = "Hallo " als std::string interpretiert, und bei Verwendung meiner Klasse nicht als String_t (denn hier hätte ich ja den passenden Ctor)? Müsste da nicht ein globaler "+"-Operator für const char* existieren?
Gruß
PuerNoctis
-
Lass das Vorhaben. Du solltest niemals von
std::basic_string<char>erben, dafür wurde diese Klasse nicht konzipiert. (Keine virtuellen Funktionen z.B.)Was willst du erreichen? Wenn du gemische Arithmetik von einer eigenen String-Klasse willst, musst du global den Operator + definieren und als Parameter 2 Stringobjekte. Der Compiler wird dann beim Auftreten eines char*s implizit den Copy-Konstruktor aufrufen.
Aber definiere erst mal 'nen eigenen String (verwaltetes dynamisches Char-Array)
-
Aja, alles klar, danke für die Antwort.
Sinn und Zweck der Vererbung war, dass ich den bestehenden basic_string<char> um einige Methoden erweitern wollte, die ich persönlich gerne hätte um "gemütlicher" programmieren zu können (z.B. simple ToUpper/Lower Methoden, oder sprintf) -- re-implementieren will ich da auch nichts, daher stört mich das Fehlen von virtuellen Methoden auch nicht.Das mit dem globalen "+"-Operator werde ich mal ausporbieren.
Danke

-
Nur bitte erbe nicht von
string, das ist ein recht übles Ding.
-
Nur um Funktionalität hinzuzufügen, kannst du globale Funktionen definieren. Viele Leute sind der Ansicht, dass
std::stringsowieso bereits zu viele Methoden hat. In C++ ist (z.B. im Gegensatz zu Java) nicht alles eine Klasse, und entsprechend macht es keinen Sinn, alles so hinzubiegen.Ich würde das so lösen:
void transform_to_upper(std::string& str);
-
Oke, danke für die Antworten

Ich werde dann von 'ner Vererbung absehen und das mit globalen Funktionen lösen.