B
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.