使用赋值运算符的队列的深层副本

时间:2014-09-28 17:21:02

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

我使用我的赋值操作符指针有麻烦,它不会创建一个新的qeueu,而是新的数组指向旧的数组。因此,当我在新队列中删除时,旧队列中的值会发生变化。

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

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

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

这是问题开始的地方,如果我将aQueue排列为10和20,然后将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) {};

1 个答案:

答案 0 :(得分:2)

目前,您没有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
  //...
};