Stringklasse Array/Pointer Problem



  • Folgender Code klappt nicht wie gewünscht.
    Fehlermeldung:
    string.cpp: In member function String String::operator+(char*)': string.cpp:318: error: no matching function for call toString::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)
    

Anmelden zum Antworten