【问题标题】:Deep copy of a queue using assignment operator使用赋值运算符的队列的深拷贝
【发布时间】:2014-09-28 17:21:02
【问题描述】:

我在使用赋值运算符时遇到了问题,它不会创建新的 qeueu,而是新数组指向旧数组。因此,当我在新队列中删除时,旧队列中的值会发生变化。

首先,我可以看到我的复制构造函数由于某种未知原因没有在我的 main 中调用,问题可能与此有关。

我用来说明问题的一些主要代码:

aQueue.enqueue(10);
    aQueue.enqueue(20);

    Queue<int> cQueue = aQueue;             

    cout << "aQueue: "; aQueue.printQeueue(2, 0);
    cout << "cQueue: "; cQueue.printQeueue(3, 0);

    cQueue.dequeue();
    cout << "aQueue: "; aQueue.printQeueue(4, 1);
    cout << "cQueue: "; cQueue.printQeueue(5, 1);
    system("pause 4");

这是问题开始的地方,如果我用 10 和 20 将 aQueue 排入队列,然后将 cQueue 分配给 aQueue,如果我打印 aQueue,结果为:10 20。之后,将 cQueue 出列并打印 aQueue,结果为:-179016023。如果我打印 cQueue,结果是:20,应该是。

输出:http://imgur.com/XBaSXAT

以下是直接或间接使用的函数:

template <typename T>
T Queue<T>::dequeue(){

    T temp = front();

    Node *old = fronten;
    fronten = fronten->next;

    delete old;

    return temp;

}


template <typename T>
Queue<T>::Queue(const T &rhs){

    Node *tempfront = rhs.fronten;

    while (tempfront.fronten!=rhs.back){
        enqueue(tempfront);
        tempfront = tempfront->next;


    }
}

template <typename T>
void Queue<T>::enqueue(const T& item){


    if (isEmpty()){
        back = fronten = new Node(item);
    }
    else
        back = back->next = new Node(item);
}

Node(const T &theElement, Node *n = nullptr): element(theElement), next(n) {};

【问题讨论】:

  • 请粘贴完整的编译示例
  • 您没有 Queue 的复制 ctor,您的模板 Queue::Queue(const T &rhs) 是 Queue 存储的类型的构造函数
  • @0d0a 现在你失去了我,但听起来很有道理。那么我应该如何定义我的复制 ctor?
  • 类内:Queue::Queue(const Queue &rhs){//...}

标签: c++ queue operator-overloading assignment-operator


【解决方案1】:

您目前没有 Queue 类的复制构造函数(或者您没有显示它)。你的

template <typename T> Queue<T>::Queue(const T &rhs)

是 Queue 存储的类型的构造函数。你需要这样的东西:

template <class T>
class Queue
{
  public:
    Queue( const Queue &);                // copy ctor
    Queue& operator=( const Queue& q);   // assignment operator
  //...
}; 

【讨论】:

  • 谢谢!工作这么多让我瞎了+我的无知;D
猜你喜欢
  • 2019-10-25
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-28
  • 1970-01-01
  • 2010-12-28
  • 2018-05-09
相关资源
最近更新 更多