Stringklasse, die Zahlen versteht
-
Hi Leute... ich hoffe, ihr könnt mir weiterhelfen
Ich arbeite grad an einer String-Klasse, der ich neben anderen Strings auch Zahlen anhängen kann (und dort dann als Strings behandelt werden)
keine Angst, die FAQ hab ich soweit gelesen, aber die dort vorgestellte Lösung klappt nicht ganz...
Bisher sieht die Funktion so aus:
CString CString::operator +( int n ) { CString sTemp; ostringstream ssStr; ssStr << n; strcpy( sTemp._acString, _acString ); strncat( sTemp._acString, ssStr.str(), MAX - strlen( sTemp._acString ) ); return( sTemp ); }(MAX bezieht sich auf die maximal erwünschte Länge des Ergebnisstrings)
beim compilieren kommt dann folgender Fehler:
CString.cpp:60: error: cannot convert 'std::basic_string<char, std::char_traits<char>, std::allocator<char> >' to 'const char*' for argument '2' to 'char* strncat(char*, const char*, size_t)'evtl geh ich auch ganz falsch an die Sache ran, aber ich hab keinen Plan, wie ich es anders lösen könnt
Danke für eure Hilfe schonmal
-
ssStr.str() liefert ein string-objekt zurück. du müsstest dem string noch mittels c_str() das char-array entlocken, damit du die funktion strncat benutzen kannst:
strncat( sTemp._acString, ssStr.str().c_str(), MAX - strlen(sTemp._acString ) );
-
strncat arbeitet mit const char*, du übergibst ihm aber einen std::string an zweiter Stelle. Das besagt die Fehlermeldung. also müsstest du aus ssStr.str() einen const char* machen, und zufälligerweise hat std::string genau dafür die Methode c_str() =>
strncat( sTemp._acString, ssStr.str().c_str(), //<-- !!! MAX - strlen( sTemp._acString ) );ABER: warum das Rad neu erfinden? die std::string Klasse hat mit ziemlicher Sicherheit bessere Performance als jede selbsterfundene Stringklasse, und sie um den nötigen Operator zu erwwitern sollte nicht allzu schwer sein. Mir persönlich missfallen die von dir verwendeten C-Routinen strncat und strcpy, sollte sich ja eigentlich um C++ handeln

-
Und wenn du die Aufgabe eleganter lösen willst, lass die direkte Arbeit mit char* und bau deine Klasse um einen std::string herum:
CString CString::operator +( int n ) { CString sTemp = *this; ostringstream ssStr; ssStr << n; sTemp._acString += ssStr.str();//btw, Bezeichner mit _ solltest du vermeiden - die sind für den Compiler reserviert return( sTemp ); }PS: Und du sparst dir einiges an Code-Wiederholungen, wenn du operator+ durch operator+= ausdrückst:
CString& CString::operator+=(int n) { ostringstream ssStr; ssStr<<n; _acString+=ssStr.str(); return *this; } CString operator+(CString l/*hier bewußt keine const-ref*/,const CString& r) { l+=r; return l; }
-
danke euch beiden schonmal
pumuckl schrieb:
Mir persönlich missfallen die von dir verwendeten C-Routinen strncat und strcpy, sollte sich ja eigentlich um C++ handeln

Ich persönlich nimm, was grad funktioniert, wie es soll

mir gings bei dem ganzen mehr um den reinen Lerneffekt als um die Funktionalität
ich werd mir aber mal std::string mal näher zu gemüte ziehen... Aber ich bräuchte einige doch etwas speziellere Funktionen (vor allem in Bezug im Umgang mit Zahlen (auch Fließkommazahlen), dass es mir vom Aufwand her der selbe erschien, das ganze komplett selber zu machen, als std::string entsprechend anzupassen.
Die Performance an sich dürfte nicht zwingend eine Rolle spielen, da es kein allzugroßes Projekt wird...-edit-
Danke CStoll... hilft mir auch schonmal weiter