Default Copy Constructor im eigenen copy ctor aufrufen?



  • Angenommen ich habe eine Klasse mit vielen vielen Membern. Unter den Membern ist ein einziger Pointer, der seine Instanz irgendwann zur Laufzeit bekommt. Die Instanz wird dann spätestens vom Destruktor der Klasse wieder freigegeben (delete).
    Wegen dem einen Pointer empfiehlt es sich, einen copy constructor für die Klasse zu schreiben. Der sähe dann ungefähr so aus:

    MyClass::MyClass(const MyClass& c) : mA(c.mA), mB(c.mB), /* ... */
    mXYZ(c.mXYZ), mPointer(NULL)
    {}
    

    Eigentlich will ich aber nur den Pointer == NULL setzen und den Rest so erledigen wie das auch der default copy constructor für mich täte. Oder kurz gesagt: ich habe keine Lust, jeden einzelnen Member "per hand" zu kopieren.
    Wie kann man das lösen?

    Grüße



  • class MyClass
    {
        template<typename T>
        struct PtrHolder
        {
            PtrHolder(const PtrHolder&) : ptr(0) {}
            T* ptr;
        };
        PtrHolder<int> mPointer;
    };
    

    So wird bei einem Kopiervorgang ptr automatisch auf 0 gesetzt. (Die Klasse ist so natürlich ziemlich unvollständig und soll nur das Prinzip verdeutlichen.)



  • Fellar schrieb:

    Angenommen ich habe eine Klasse mit vielen vielen Membern.

    Solltest du eigentlich nicht. Oft ist das ein Hinweis darauf, dass eine Aufteilung in mehrere Klassen ganz gut käme.

    Sobald du den Kopierkonstruktor selbst implementierst, bist du für die gesamte Kopiersemantik zuständig. Das Rauspicken einzelner Member ist nicht möglich. Aber nur wegen des Schreibaufwands sollte das auch nicht so schlimm sein, gerade wenn die Klassen gut aufgeteilt sind (dann reicht für die meisten nämlich der Default-Kopierkonstruktor).

    Was machst du eigentlich mit dem Zuweisungsoperator? Um Codeduplizierung zu sparen, empfiehlt sich unter Umständen Copy&Swap.



  • Ok, dacht ich mir. Dank für die schnellen Antworten!


Anmelden zum Antworten