我编写了一个Stack and Queue实现(基于链接列表)。有一个堆栈(bigStack
)。例如,我将bigStack
分开(示例:stackA
和stackB
)。我pop()
从bigStack
一个节点,我push()
在stackA
中。同样,我在push()
中使用stackB
。我希望bigStack
不变。因此,我想克隆bigStack
对象。如何在C++中克隆对象?还是我的问题有其他解决方案?
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);
};
然后...
Stack copyStack = veriYapilariDersi;
copyStack.DisplayStack();
最佳答案
典型的解决方案是编写自己的函数来克隆对象。如果您能够提供复制构造函数和复制赋值运算符,则可能需要这样做。
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
)初始化rhs
的成员。但是,您仍然需要确保为任何基类提供初始化其成员的机会。您可以通过调用基类来做到这一点:
Stack(const Stack& rhs)
: List(rhs) // calls copy ctor of List class
{
}
Stack& operator=(const Stack& rhs)
{
List::operator=(rhs);
return * this;
};