2013-04-07 2 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'? –

+1

Нет, если вы не разделяете код для очереди. Сложно отлаживать код других людей, когда вы не видите код. – john

ответ

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

узла является переменным стеком, и это конструктор изменит _first, а первый -> _ право указывать на какой-то адрес стеки , что приведет к непредсказуемым результатам, в вашем примере использования < < endl; модифицированный стек, приводящий к некоторому выходу мусора. Чтобы исправить это, вам нужно использовать новое для размещения новых узлов и, конечно же, освободить их позже с помощью delete.

Смежные вопросы