2014-09-28 21 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