0

私はEclipseを使用してキューをコーディングしていました.getFirstと呼ばれる1つの関数は次のように定義されています:

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 を使用し、もちろん後で削除して解放する必要があります。

于 2013-04-07T17:34:20.810 に答える