Teilobjekt einer Klasse kopieren



  • Hallo Forum,
    wenn ich den Standardkopierkonstruktor verwende um ein Objekt zu kopieren, dann wird, falls es ein Teilobjekt besitzt, ein neues erstellt, statt auch kopiert zu werden.

    Warum ist das so?



  • Nein, das wird auch kopiert.

    Reduziere mal deinen Code auf ein Minimalbeispiel, dann kann dir eventuell jemand helfen.

    Beim Standardkopierkonstruktor wird für jedes "Teilobjekt" der Kopierkonstruktor aufgerufen (diese Definition ist rekursiv!), kann sein, dass der nicht das macht, was du erwartest.



  • class Player
    {
    private:
    	Dog Dobermann;
    public:
    	Player()
        {
            cout << "Konstruktor aufgerufen.\n";
        }
    
    	Player(const Player&)
        {
            cout << "Kopiere\n";
        }
    
    	~Player()
    	{
    		cout << name << "\t left   the game\n";
    	}
    };
    
    int main()
    {
    	Player Test();
    	Player ansauger24(Test);
    
    	return 0;
    }
    

    Was passiert mit dem Objekt "Dobermann" der Klasse "Dog", im übergeordneten Objekt "Test". Als erstes wird ja der Standardkonstruktor für die Teilobjekte ausgeführt, dann der Konstruktor für die übergeordneten Objekte, aber warum werden die Teilobjekte nicht kopiert?



  • Wenn du einen Kopierkonstruktor schreibst, der nichts kopiert, aber einen dummen Text ausgibt, passiert eben genau das: es wird nichts kopiert, aber ein dummer Text ausgegeben.



  • Du verwendest in deinem Beispiel aber nicht den Standardkopierkonstruktor...
    Wenn du den Kopierkonstruktor fuer eine Klasse selbst schreibst, dann musst du auch jedes Objekt manuell kopieren:

    class Player
    {
    private:
        Dog Dobermann;
    public:
        Player()
        {
            cout << "Konstruktor aufgerufen.\n";
        }
    
        Player(const Player& p) : Dobermann(p.Dobermann)
        {
            cout << "Kopiere\n";
        }
    
        ~Player()
        {
            cout << name << "\t left   the game\n";
        }
    };
    

Anmelden zum Antworten