2014-09-28 65 views
0

我有使用我的赋值操作符指针的麻烦,它不会创建新的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"); 

这就是问题的开始,如果我排队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) {}; 
+0

请贴,编译 – 4pie0 2014-09-28 17:23:54

+2

你没有队列副本构造函数完整的例子,你的模板 队列 ::队列(常量T&右)是构造函数队列从类型它存储 – 4pie0 2014-09-28 17:26:50

+0

@ 0d0a现在你失去了我,但它听起来像它使感觉。那么我应该如何定义我的拷贝机? – Prolle 2014-09-28 17:34:56

回答

2

您不必在目前的拷贝构造函数为你的队列类(或你不显示它)。您的

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

谢谢!一直工作太多,这使我失明+我的未知; D – Prolle 2014-09-28 18:23:59