5

私の質問: キューにエンキューした唯一のノードをデキュー (実際には削除) するときに、プログラムで実行時エラーが発生するのはなぜですか? 適切な関数にいくつかのデバッグ ステートメントを記述しました。これは、行に問題があることを指摘しています。

フロントを削除します。

プログラムがその行を実行すると、私に応答しないため終了しようとします。私は試した

if(front) フロントを削除します。

しかし、役に立たない。Google で答えを見つけようとしましたが、満足のいく結果は得られませんでした。これは非常に奇妙です。私は数年前から OOP を扱ってきましたが、これは初めてのことです。これが私のコードです:

================================ キュー.cpp =============== ========================

#include <iostream>
#include "Queue.h"
using namespace std;

Queue::Queue()
{
    QueueNode * front = NULL;
    QueueNode * rear = NULL;
}

Queue::~Queue()
{
    while(rear) dequeue();
}

void Queue::enqueue(int row, int col)
{
    // create the child state:
    QueueNode * newNode;
    newNode = new QueueNode;

    // write in child state's coordinates:
    newNode->row = row;
    newNode->col = col;

    // enqueue the child state:
    if(!front) // if empty, new is front
    {
        // first node = front and back
        front = newNode;
        rear = newNode;
    }
    else // not the first node:
    {
        newNode->next = rear; // new points to back
        rear = newNode; // new is the back
    }
}

void Queue::dequeue()
{
    cout << "\nHere\n";
    delete front;
    cout << "\nHere 2\n";
    front = rear;
    cout << "\nHere 3\n";
    while(front->next) front = front->next;
    cout << "\nHere 4\n";
}

================================= キュー.h ============== =========================

#ifndef QUEUE_H
#define QUEUE_H

class Queue
{
    public:
        struct QueueNode
        {
            // numbers:
            int row;
            int col;

            QueueNode * next;
        };

        QueueNode * front;
        QueueNode * rear;

        Queue();
        ~Queue();

        void enqueue(int, int);
        void dequeue();
        //void traverse(); // scan for repetition of location.
        //void displayQueue() const;
};

#endif

ノート:

1) メイン ドライバーのコードは含めませんでした。これは、4 つのスペースをタブに置き換える作業が多く必要になるためです。

2) キュー ノードを 1 つだけキューに入れました。

3) 問題が何であるかを突き止めるのに必死だったので、キュー クラスですべてを公開しました。とりあえずそのままにしておきます。

4) StackOverflow.com で質問するのはこれが初めてなので、何か間違ったことをしたとしても、まだ学習中です。

5) Visual C++ 2008 Express Edition を使用しています。

繰り返しますが、私の質問: キュー内の唯一のノードを削除すると、プログラムで実行時エラーが発生するのはなぜですか?

4

1 に答える 1

6

エラーはこちら

Queue::Queue()
{
    QueueNode * front = NULL;
    QueueNode * rear = NULL;
}

する必要があります

Queue::Queue()
{
    front = NULL;
    rear = NULL;
}

あなたのバージョンでは、コンストラクターに 2 つのローカル変数があり、たまたまクラスの変数と同じ名前を持っています。したがって、コンストラクターはクラスをまったく初期化していません。

ところで、初期化子リストを使用する習慣を身に付ける必要があります

Queue::Queue() : front(NULL), rear(NULL)
{
}

この間違いが起こらないなら

ところで、それはよくある質問です。

于 2013-09-29T08:00:57.390 に答える