0

ノード (整数データ) を作成して SLL に挿入するために、C++ で次のコードを書きました。

#include <stdio.h>

class Node
{
    public:
        int data;
        Node * next;
        Node * first;
        Node() {}

        void insert(int dat)
        {
            Node * newnode = new Node();
            newnode->data=dat;
            newnode->next=NULL;
            if(first==NULL)
            {
                first=newnode;
            }
            else
            {
                Node *temp=first;
                while(temp->next!=NULL)
                { temp=temp->next; }
                temp->next=newnode;
            }
        }
};

int main()    
{
    Node * a=new Node();
    a->insert(12);
    return 0;
}

最初に、Node コンストラクターを Node(int dat) にオーバーライドしようとしました。その中で、挿入で作成するすべての新しいノード (data=dat、next=NULL) の初期化を試みました。Insert は main から "dat" 値で呼び出され、オーバーロードされた Node コンストラクターを呼び出して、データを dat および NULL に初期化します。それが私のプログラムのクラッシュにつながりました。

そこで、デフォルトのコンストラクターとオーバーロードされたコンストラクターの両方を取り出し、挿入自体で新しい各要素の初期化を行いました。私のプログラムは正常に動作します。ただし、(コードの 10 行目に示されているように) デフォルトのコンストラクターを追加しても、プログラムがクラッシュします。両方のケースでなぜこれが起こっているのか誰か教えてもらえますか?

ありがとう。

4

3 に答える 3

1

デフォルトのコンストラクターは、データ メンバーを初期化しないままにします。したがって、この行:

Node * a=new Node();

初期化されていないメンバーで Node を作成するため、ノードを追加しようとすると問題が発生します。デフォルトのコンストラクターを削除すると、上記の行 (new Node()クラスにユーザー定義のコンストラクターがないという事実と組み合わせた括弧のため) により、すべてのメンバーの値が初期化されるため、ポインターは NULL に初期化され、取得します。予想される動作。

括弧を省略した場合:

Node * a = new Node;

何もしないデフォルトのコンストラクターがある場合と同様に、データ メンバーは初期化されません。

正しい解決策は、既定のコンストラクターを修正して、すべてのメンバーを明示的に初期化することです。

Node() :data(0), next(nullptr), first(nullptr) {}
于 2013-10-28T06:37:01.217 に答える
0

このようにコンストラクターでメンバー変数を初期化します

Node() {
             data =0;
             first = NULL;
             next = NULL;
}
于 2013-10-28T07:28:13.953 に答える