2017-05-03 15 views
-4

次のように..私はAVL木のクラスを作成していると私は私のノードがAVLクラスへのポインタを持つようにしたい:(C++ - 構造体のクラスへのポインタ?

struct node 
{ 
    int id,height; 
    node *left,*right; 
    class AVL *neighbor; 
}; 

事は、私は私のクラスにポインタを使用することはできませんです私がそうするとプログラムが壊れる)、コンストラクタが呼び出されていないためだと思う。ポインタが何も指していない。どうすればいいの?私はポインタのための他のコンストラクタを作成し、ポインタのためのメモリを割り当てますか?ありがとう!

+0

間違い:) – Meccano

+0

は申し訳ありませんが、[MCVE] –

+0

私はちょうどそれを追加作成する方法を参照してくださいあなたのコード添付してください? – Savvas

答えて

2

その宣言にコンストラクタはありません。デフォルトのコンストラクタではデフォルト値が設定されません。ポインタは何も指していない、何かを指していることを意味する割り当てられていませんが、それは何でもかまいません。使用しようとするとub(未定義の動作)です。

class AVL; 

struct node 
{ 
    // default constructor 
    node() 
     : left(NULL), right(NULL) 
    { 
    } 

    int id,height; 
    node *left,*right; 
    AVL *neighbor; 
}; 

私はAVLのフォワード宣言の自由を取っています。上記のコードにはデフォルトのコンストラクタがありますが、左と右をNULL(NULL == 0)に設定するので、それらを何かに設定する際に使用しないでください。

すなわち

node n1; 
node n2; 
*n1.left = n2; // boom, since n1.left is being accessed without being set 
n1.left = &n2; // point n1.left to n2 
*n1.left = n1; // n1.left is not null so is valid. 
+1

'NULL'や' nullptr'を使って '0'ではなくヌルポインタを初期化することをお勧めします。 ( 'void *)nullptr ==(void *)NULL'と'(void *)nullptr ==(void *)0')を使うべきではなく、 'NULL'と' nullptrポインタがヌルであることを明確にする。 ( 'nullptr'はC++ 11以降でしか使えないことに注意してください。) –

+0

@JustinTime合意。歓迎される。 – lfgtm

関連する問題