2013-04-07 5 views
0
I 큐를 ​​코딩하기 식을 사용 하였다

, getFirst와 호출 한 기능으로 정의된다 :C++ 클래스 템플릿 리턴 값 오류

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

'머리'를 어떻게 선언하고 지정 했습니까? –

+1

대기열에 대한 코드를 공유하지 않는 한 아닙니다. 코드를 볼 수 없을 때 다른 사람들 코드를 디버그하기가 어렵습니다. – john

답변

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

노드는, 스택 변수이며, 그것의 생성자는 첫번째 _first 변경합니다 -> _ 권리 일부 스택 주소를 가리키는 수 , 귀하의 예제 사용에서 예기치 않은 결과를 이끌 것입니다 < < endl; 일부 쓰레기 출력으로 이어지는 스택 수정. 이 문제를 해결하려면 새로운 노드 할당을 위해 new를 사용해야하며, 물론 나중에 삭제하여 해제해야합니다.