如何在C ++中克隆对象?还是有另一种解决方案吗?

时间:2012-10-15 19:36:06

标签: c++ data-structures stack queue

我写了一个Stack and Queue实现(基于Linked List)。有一个堆栈(bigStack)。例如,我将bigStack(例如:stackAstackB)分开。我pop()中的bigStack节点,push()中的stackA节点push()。以同样的方式,stackB中的bigStack。我希望bigStack不要改变。因此,我想克隆class Stack : public List { public: Stack() {} Stack(const Stack& rhs) {} Stack& operator=(const Stack& rhs) {}; ~Stack() {} int Top() { if (head == NULL) { cout << "Error: The stack is empty." << endl; return -1; } else { return head->nosu; } } void Push(int nosu, string adi, string soyadi, string bolumu) { InsertNode(0, nosu, adi, soyadi, bolumu); } int Pop() { if (head == NULL) { cout << "Error: The stack is empty." << endl; return -1; } else { int val = head->nosu; DeleteNode(val); return val; } } void DisplayStack(void); }; 对象。如何在C ++中克隆对象?或者我的问题有另一种解决方案吗?

Stack copyStack = veriYapilariDersi;
copyStack.DisplayStack();

...然后

{{1}}

3 个答案:

答案 0 :(得分:30)

典型的解决方案是编写自己的函数来克隆对象。如果您能够提供复制构造函数和复制分配操作符,则可能需要这样做。

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

有时提供显式clone()方法是有益的,特别是对于多态类。

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

编辑:由于Stack没有成员变量,因此在复制构造函数或复制赋值运算符中无需执行任何操作即可从所谓的“右侧”初始化Stack的成员({ {1}})。但是,您仍需要确保任何基类都有机会初始化他们的成员。

您可以通过调用基类来执行此操作:

rhs

答案 1 :(得分:3)

如果你的对象不是多态的(并且堆栈实现可能不是),那么根据其他答案,你想要的是复制构造函数。请注意,C ++中的复制构造和赋值之间存在差异;如果你想要两种行为(并且默认版本不符合你的需要),你就必须实现这两种功能。

如果您的对象是多态的,那么切片可能是一个问题,您可能需要跳过一些额外的箍来进行正确的复制。有时候人们使用名为clone()的虚拟方法作为多态复制的助手。

最后,请注意,如果您需要替换默认版本,正确复制和分配实际上非常困难。通常最好设置对象(通过RAII),使复制/分配的默认版本执行您希望它们执行的操作。我强烈建议您查看Meyer's Effective C++,尤其是第10,11,12项。

答案 2 :(得分:2)

在C ++中复制对象意味着克隆。那里没有任何特殊的克隆。

正如标准所示,复制后你应该有2个相同副本的同一个对象。

有两种类型的复制:在非初始化空间上创建对象时的复制构造函数,以及在设置新状态之前需要释放对象的旧状态的复制操作符。