2013-04-07 93 views
0

我用蝕編寫了一個隊列,稱之爲getFirst一個函數被定義爲:C++類模板返回值誤差

template<class T> 
T getFirst(){ 
    return head->data; 
} 
在主

,宣告隊列Q和輸入像一些有效數據之後:

Queue<int> Q; 
Q.add(2); 
cout << Q.getFirst() << endl; 

輸出是2,這正是我所期望的;

但是!!!如果我的代碼更改爲:

Queue<int> Q; 
Q.add(2); 
cout << Q.getFirst() << endl; 
cout << Q.getFirst() << endl; 

輸出不是:

2 
2 

但類似:

2 
2657382 

後的一些想法,我修改了代碼:

Queue<int> Q; 
Q.add(2); 
cout << Q.getFirst(); 
cout << Q.getFirst() << endl; 

這次它工作了!正好!!輸出是22,這是有道理的。

有沒有人可以向我解釋這裏的問題?

節點和隊列的定義是通用的,一般:

template<typename T> 
class Node{ 
public: 
Node(T data, Node* left = 0, Node* right = 0): _data(data), _left(left), _right(right){ 
    if(left) 
     left->_right = this; 
    if(right) 
     right->_left = this; 
} 
Node(): _right(0){} 
private: 
T _data; 
Node<T>* _left; 
Node<T>* _right; 

friend class Queque<T>; 
}; 

template<typename T> 
class Queque{ 
public: 
Queque(): _first(new Node<T>), _size(0){ 
    _first->_right = _first; 
    _first->_left = _first; 
} 

void addFirst(T item){ 
    Node<T>(item, _first, _first->_right); 
    _size++; 
} 

T examineFirst(){ 
    return _first->_right->_data; 
} 

private: 
Node<T>* const _first; 
int _size; 
}; 
+0

你是如何聲明和分配'head'的? – 2013-04-07 17:09:33

+1

除非您共享隊列的代碼,否則不會。當你看不到代碼時,很難調試其他人的代碼。 – john 2013-04-07 17:09:58

回答

0
void addFirst(T item){ 
    Node<T>(item, _first, _first->_right); 
    _size++; 
} 

節點是一個堆棧變量,它的構造會改變_First,和第一 - > _右是指向一些堆棧地址,這將導致不可預知的結果,在您的示例中使用< < endl;修改後的堆棧,導致一些垃圾輸出。爲了解決這個問題,你需要使用新的節點分配新的節點,當然以後再用delete來釋放它們。