Konstruktoren



  • Hallo Leute, könnt ihr mir vielleicht sagen, was an folgendem Beispiel nicht funktioniert ?

    class Example{
    private:
     // member
     char pStr;
    public:
     // constructor
     Example(char *pStr){
      this->pStr = new char[strlen(pStr)+1];
      strcpy(this->pStr,pStr);
     }
    
     // copy constructor
     Example(Example &e){
      this = Example(e.pStr); // hier gibt es einen Compiler - Fehler aus dem ich nicht so recht schlau werde...
     }
    
     // destructor
     ~Example(void){
      delete []this->pStr;
     }
    }
    


  • Ishildur schrieb:

    char pStr;
    
    char* pStr;
    


  • Das war ein kleiner Rechtschreibefehler. Sollte aber mit ziemlicher Sicherheit nichts mit dem Problem zu tun haben !!



  • Ishildur schrieb:

    Hallo Leute, könnt ihr mir vielleicht sagen, was an folgendem Beispiel nicht funktioniert ?

    alles?

    class Example{
    private:
     // member
     char pStr;
    public:
     // constructor
     Example(char *pStr){
      this->pStr = new char[strlen(pStr)+1]; // pStr ist char, dem kann also kein char* zugewiesen werden
      strcpy(this->pStr,pStr); // strcpy erwartet char*, nicht char
     }
    
     // copy constructor
     Example(Example &e){ // hier stand eben noch Excample könnt ich schwören ;)
      this = Example(e.pStr); // hier gibt es einen Compiler - Fehler aus dem ich nicht so recht schlau werde...
     // seit wann kann man an this zuweisen? was soll das überhaupt werden?
     // ausserdem müssen Kopierkonstruktoren const-Referenzen annehmen
     // ausserdem ist der identisch mit dem, den der Compiler generieren würde
     // ausserdem ist er semantisch falsch, da die Klasse den Speicherblock auf den pStr zeigt,
     // besitzt, der Kopierkonstruktor aber nur eine flache Kopie macht
     // das führt zu einem doppelten delete und damit zu undefiniertem Verhalten
     }
    
     // destructor
     ~Example(void){
      delete []this->pStr;
     }
    }
    

    Um nicht soviel dranrumzuflicken, so gehts richtig:

    #include <cstring>
    
    class Example {
      char * pStr;
    public:
      Example(char *pStr): pStr(new char[std::strlen(pStr) + 1]) {
        strcpy(this->pStr, pStr);
      }
    
      Example(Example const& e): pStr(new char[std::strlen(e.pStr) + 1]) {
        strcpy(pStr, e.pStr);
      }
    
      ~Example() {
        delete[] pStr;
      }
    };
    

    PS: Der Zuweisungsoperator fehlt noch, aber das sei dem Leser als Übung überlassen.


Anmelden zum Antworten