使用赋值运算符对队列进行深度复制

Deep copy of a queue using assignment operator

本文关键字:深度 复制 队列 赋值运算符      更新时间:2023-10-16

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

首先,我可以看到,由于某种未知的原因,我的复制构造函数没有在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之后,结果为:-179101023。如果我打印cQueue,结果是:20,应该是这样。

输出:https://i.stack.imgur.com/0xRwC.jpg

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

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类的复制构造函数(或者您没有显示它)。你的

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
  //...
};