2016-05-03 4 views
1

nullptrた:は、この - > m_xyは、だから私は少しバイナリツリーを作りたかったのですが、ルートの後の最初の値を入力した後、私の最初のC++プログラムとして

例外がスローさ:アクセス違反の書き込み。

this-> m_leftはnullptrです。

私のテスト入力:int値の減少。

マイコード:

#include<iostream> 

class BinaryTree 
{ 
public: 
    BinaryTree *m_left; 
    int m_key; 
    BinaryTree *m_right; 

    void insert(int value) 
    { 
     BinaryTree son; 

     if (value <= m_key) 
     { 
      if (m_left == NULL) 
       *m_left = { NULL, value, NULL }; //Error 
      else 
      (*m_left).insert(value); 
     } 
     //uniportant stuff ... 
    } 

    //unimportant stuff 
}; 

int main() 
{ 
int rootValue(0); 
std::cout << "Enter a value for the root: "; 
std::cin >> rootValue; 
std::cout<<std::endl; 

BinaryTree root = { NULL, rootValue, NULL }; 

int leafValue(1); 
std::cout << "Enter a value for the leaf or enter 0 to finish: "; 
std::cin >> rootValue; 
while (leafValue != 0) 
{ 
    root.insert(leafValue); 
    std::cout << "Enter a value for the leaf or enter 0 to finish: "; 
    std::cin >> rootValue; 
    std::cout << std::endl; 
} 

root.print(); 

return 0; 

} 
+1

それが彼らのためにオブジェクトを割り当てる前に、あなたのようなデリファレンスポインタを調べ、それらが自動的に作成されていません。あなたはどこかでそれらを「新しくする」必要があります。 – Niall

+0

ああええ、thx :)これは私を全部手伝った! – Bubibob

答えて

3

あなたrootノードを作成するとき、あなたは地元のBinaryTreeオブジェクトを作成します。あなたは、あなたの最初の値を挿入すると

m_leftは以下の支店で、NULLです:何が起こる

if (m_left == NULL) 
    *m_left = { NULL, value, NULL }; // Assignment to a NULL pointer. 

?オブジェクトをコピーするためのヌルポインタの参照を解除します。この時点での動作は未定義で、失敗することになります。

逆参照されたポインタ* m_leftに何かを割り当てる前に、ポインタは有効なオブジェクトを指していなければなりません。

次のように、割り当てを修正することができます。

m_left = new BinaryTree{ NULL, value, NULL }; 
+0

ありがとう、これは私が思いつくことができたよりも少し良いです:) – Bubibob

1

[OK]を、問題解決を。

に単純に変更

 *m_left = { NULL, value, NULL }; 

 m_right = new BinaryTree; 
     (*m_right).m_left = NULL; 
     (*m_right).m_key = value; 
     (*m_right).m_right = NULL; 

THXニール

関連する問題