我编写了一个Stack and Queue实现(基于链接列表)。有一个堆栈(bigStack)。例如,我将bigStack分开(示例:stackAstackB)。我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;
};

10-05 21:31