Wie klont man ein Objekt in C++? Oder gibt es eine andere Lösung?

Wie klont man ein Objekt in C++? Oder gibt es eine andere Lösung?

Die typische Lösung hierfür besteht darin, eine eigene Funktion zum Klonen eines Objekts zu schreiben. Wenn Sie Kopierkonstruktoren und Kopierzuweisungsoperatoren bereitstellen können, reicht dies möglicherweise nicht mehr aus.

class Foo
{ 
public:
  Foo();
  Foo(const Foo& rhs) { /* copy construction from rhs*/ }
  Foo& operator=(const Foo& rhs) {};
};

// ...

Foo orig;
Foo copy = orig;  // clones orig if implemented correctly

Manchmal ist es vorteilhaft, einen expliziten clone() anzugeben Methode, insbesondere für polymorphe Klassen.

class Interface
{
public:
  virtual Interface* clone() const = 0;
};

class Foo : public Interface
{
public:
  Interface* clone() const { return new Foo(*this); }
};

class Bar : public Interface
{
public:
  Interface* clone() const { return new Bar(*this); }
};


Interface* my_foo = /* somehow construct either a Foo or a Bar */;
Interface* copy = my_foo->clone();

EDIT:Seit Stack keine Mitgliedsvariablen hat, gibt es im Kopierkonstruktor oder Kopierzuweisungsoperator nichts zu tun, um Stack zu initialisieren 's Mitglieder von der sogenannten "rechten Seite" (rhs ). Sie müssen jedoch immer noch sicherstellen, dass alle Basisklassen die Möglichkeit haben, ihre zu initialisieren Mitglieder.

Dazu rufen Sie die Basisklasse auf:

Stack(const Stack& rhs) 
: List(rhs)  // calls copy ctor of List class
{
}

Stack& operator=(const Stack& rhs) 
{
  List::operator=(rhs);
  return * this;
};

In C++ bedeutet das Kopieren des Objekts Klonen. Es gibt kein spezielles Klonen in der Sprache.

Wie der Standard vorschlägt, sollten Sie nach dem Kopieren zwei identische Kopien desselben Objekts haben.

Es gibt zwei Arten des Kopierens:Kopierkonstruktor, wenn Sie ein Objekt in einem nicht initialisierten Bereich erstellen, und Kopieroperator, bei dem Sie den alten Zustand des Objekts (der als gültig erwartet wird) freigeben müssen, bevor Sie den neuen Zustand festlegen.


Wenn Ihr Objekt nicht polymorph ist (und eine Stapelimplementierung wahrscheinlich nicht), dann möchten Sie gemäß den anderen Antworten hier den Kopierkonstruktor. Bitte beachten Sie, dass es Unterschiede zwischen dem Erstellen von Kopien und der Zuweisung in C++ gibt; Wenn Sie beide Verhaltensweisen wünschen (und die Standardversionen nicht Ihren Anforderungen entsprechen), müssen Sie beide Funktionen implementieren.

Wenn Ihr Objekt polymorph ist, kann das Slicing ein Problem darstellen, und Sie müssen möglicherweise durch einige zusätzliche Rahmen springen, um ordnungsgemäß zu kopieren. Manchmal verwenden Leute eine virtuelle Methode namens clone() als Helfer für polymorphes Kopieren.

Beachten Sie schließlich, dass das richtige Kopieren und Zuweisen, wenn Sie die Standardversionen ersetzen müssen, tatsächlich ziemlich schwierig ist. Es ist normalerweise besser, Ihre Objekte (über RAII) so einzurichten, dass die Standardversionen von Kopieren/Zuweisen tun, was Sie wollen. Ich empfehle Ihnen dringend, sich Meyer's Effective C++ anzusehen, insbesondere die Punkte 10,11,12.