0

我正在使用 eclipse 编写一个队列,一个名为 getFirst 的函数定义为:

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,这是有道理的。

有人可以在这里向我解释这个问题吗?

Node 和 Queue 的定义是通用的和通用的:

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;
};
4

1 回答 1

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

Node 是一个堆栈变量,它的构造函数将更改 _first 和 first->_right 指向某个堆栈地址,这将导致无法预测的结果,在您的示例用法中 << endl; 修改堆栈,导致一些垃圾输出。要解决此问题,您需要将 new 用于新节点分配,当然稍后使用 delete 释放它们。

于 2013-04-07T17:34:20.810 回答