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.