ausformulieren
Kern-Idee: Kopierkonstruktor und operator= sollten implementiert werden, wenn mit dynamischen Speicherallokierungen gearbeitet wird, damit diese bei der Verwendung von operator= richtig verwendet werden (d.h. entweder Zeiger übernommen oder neue Zeiger mit gleichen Werten, dann aber alten Zeiger auch löschen!)
#include <iostream>
class SimplePerson {
private:
std::string name;
int* finger;
public:
SimplePerson(std::string const & name, int const zahl)
// benutze Copy-Ctor von std::string
: name(name)
, finger(new int(zahl)) {
std::cout << this << ": " << this->name << " wurde geboren und "
<< "zeigt auf " << this->finger << " (" << *(this->finger)
<< ")" << std::endl;
}
virtual ~SimplePerson() {
std::cout << this << ": " << this->name << " ist verstorben und "
<< "zeigte auf " << this->finger << " (" << *(this->finger)
<< ")" << std::endl;
delete this->finger;
}
void print() {
std::cout << this << ": " << this->name << " zeigt auf "
<< this->finger << " (" << *(this->finger) << ")" << std::endl;
}
};
class ComplexePerson {
private:
std::string name;
int* finger;
public:
ComplexePerson(std::string const & name, int const zahl)
// benutze Copy-Ctor von std::string
: name(name)
, finger(new int(zahl)) {
std::cout << this << ": " << this->name << " wurde geboren und "
<< "zeigt auf " << this->finger << " (" << *(this->finger)
<< ")" << std::endl;
}
ComplexePerson(ComplexePerson const & other)
// benutze Copy-Ctor von std::string
: name(other.name)
, finger(new int(*(other.finger))) {
std::cout << this << ": " << this->name << " wurde aus "
<< &other << " geklont und zeigt nun auf " << this->finger
<< " (" << *(this->finger) << ")" << std::endl;
}
virtual ~ComplexePerson() {
std::cout << this << ": " << this->name << " ist verstorben und "
<< "zeigte auf " << this->finger << " (" << *(this->finger)
<< ")" << std::endl;
delete this->finger;
}
ComplexePerson operator=(ComplexePerson const & other) {
std::cout << this << ": " << this->name << " zeigte auf "
<< this->finger << " (" << *(this->finger) << ")"
<< " und wird ersetzt von " << other.name << " aus " << &other
<< " ersetzt";
delete this->finger;
// benutze Copy-Ctor von std::string
this->name = other.name;
this->finger = new int(*(other.finger));
std::cout << " und zeigt nun auf " << this->finger << " ("
<< *(this->finger) << ")" << std::endl;
// dereferenziere this
return *this;
}
void print() {
std::cout << this << ": " << this->name << " zeigt auf "
<< this->finger << " (" << *(this->finger) << ")" << std::endl;
}
};
void simpleTest() {
SimplePerson s1("Hansi", 3);
SimplePerson s2("Peter", 9);
std::cout << "copy ctor" << std::endl;
SimplePerson s3(s1); // Hansi mittels copy-ctor klonen
std::cout << "operator=" << std::endl;
s2 = s1; // Hansi mittels operator= klonen
std::cout << "print" << std::endl;
s1.print();
s2.print();
s3.print();
}
void complexeTest() {
ComplexePerson p1("Hansi", 3);
ComplexePerson p2("Peter", 9);
std::cout << "copy ctor" << std::endl;
ComplexePerson p3(p1); // Hansi mittels copy-ctor klonen
std::cout << "operator=" << std::endl;
p2 = p1; // Hansi mittels operator= klonen
std::cout << "print" << std::endl;
p1.print();
p2.print();
p3.print();
}
int main() {
//simpleTest();
std::cout << "-------------------------" << std::endl;
complexeTest();
}