Stringklasse Array/Pointer Problem
-
Folgender Code klappt nicht wie gewünscht.
Fehlermeldung:
string.cpp: In member functionString String::operator+(char*)': string.cpp:318: error: no matching function for call to
String::String(String)
string.cpp:87: error: candidates are: String::String(String&)
string.cpp:74: error: String::String(char*)Wo liegt der Fehler ?
// verkettet einen String und str String String :: operator + (String str) { char ch[161]; String str1(""); strcpy(ch, zeichen); strcpy(&ch[strlen(zeichen)], str.zeichen); // da Zeichenarray nur 80 Felder hat, wird hier abgebrochen ch[80] = 0; // gesamter Zeichenarray wird in String str1 kopiert strcpy(str1.zeichen, ch); // Returnwert wird als String zurueckgegeben return str1; } // verkettet einen String und ch String String :: operator + (char *ch) { String str(ch); // Returnwert ergibt sich aus aktuellem Objekt + uebergebenen String return (*this + str); // hier liegt wohl der Fehler, keine verkettung möglich }
-
Wenn ich das richtig sehe, hast du keinen geeigneten Copy-Kontruktor.
//so sollte der aussehen String::String(const String&) //und nicht so String::String(String&)
und ein bischen mehr Const-Correctness
const String String::operator+(const String& str) const String String::operator+(char const *ch)
-
Ok hat funktioniert.
Kannst grad noch erklären, wieso das const soviel bewirkt ?
Oder RTFM ?
-
Guckst du hier
-
C Newbie schrieb:
const String String::operator+(const String& str) const String String::operator+(char const *ch)
Wo ist das denn const-korrekt?
Möchtest Du nicht gerne String = String + String + String + String schreiben können? Das verhinderst Du effektiv mit dem const. return-by-value const zu machen, gibt nur selten Sinn. Dazu kann ich Dir nur Exceptional C++ empfehlen.
-
Harry Hirsch schrieb:
Wo ist das denn const-korrekt?
Möchtest Du nicht gerne String = String + String + String + String schreiben können?Kann ich doch
Harry Hirsch schrieb:
return-by-value const zu machen, gibt nur selten Sinn.
Mit obrigen Code kann man dann aber nicht mehr soetwas schreiben:
String + String = "Hallo";
Harry Hirsch schrieb:
Dazu kann ich Dir nur Exceptional C++ empfehlen.
Stimmt. Seite 215 Punkt 10 und 11 geben mir Recht.
-
const String String::operator+(const String& str) const const String String::operator+(char const *ch) const
dürfte alle zufrieden stellen, oder?
-
Wobei mir einfällt, das wenigstens die Funktion die den char-Array übernimmt, keine Memberfunktion seien sollte, sondern eine globale Funktion.
-
finix schrieb:
const String String::operator+(const String& str) const const String String::operator+(char const *ch) const
dürfte alle zufrieden stellen, oder?
Noch besser wäre aber folgendes
const String operator +(const String& lhs, const String& rhs) const String operator +(const String& lhs, char const* rhs) const String operator +(char const* lhs, const String& rhs)