FIXME 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();
}