2017-10-12 12 views
1

私はテンプレートプログラミングを初めて導入しました。だから私はいくつかの基本的なテンプレートプログラミングから始めました。私はいくつかのエラーが発生しているBinaryTree.hヘッダファイルを作成しました。私のコードの下に参照してください。C++でテンプレート内に別のテンプレート変数を宣言する

#ifndef BINARYTREE_H_ 
#define BINARYTREE_H_ 

#include <cstdlib> 
#include<ctime> 


template<typename T> 
struct Node 
{ 
    T data; 
    Node *lChild; 
    Node *rChild; 
}; 

template<class T> 
class BinaryTree 
{ 
    private: 
     Node<T> *root; 

     void addHelper(T value, Node<T> *leaf) 
     { 

      if(leaf == NULL) 
      { 
       leaf->data = value; 
       leaf->lChild = NULL; 
       leaf->rChild = NULL; 
      } 

      else if(leaf->lChild == NULL) 
      { 
       leaf->lChild->data = value; 
       leaf->lChild->lChild = NULL; 
       leaf->lChild->rChild = NULL; 
      } 
      else if(leaf->rChild == NULL) 
      { 
       leaf->rChild->data = value; 
       leaf->rChild->lChild = NULL; 
       leaf->rChild->rChild = NULL; 
      } 
      else 
      { 
       srand((int)time(0)); 
       int i = rand() % 2; 
       if(i == 0) 
       { 
        addHelper(value, leaf->lChild); 
       } 
       else 
       { 
        addHelper(value, leaf->rChild); 
       } 
      } 
     } 

     void traverseHelper(Node<T> *leaf) 
     { 
      if(leaf == NULL) 
       return; 
      traverseHelper(leaf->lChild); 
      traverseHelper(leaf->rChild); 
      std :: cout << leaf->data; 
     } 
    public: 
     BinaryTree() 
     { 
      root = NULL; 
     } 

     void addNode(T value) 
     { 
      addHelper(value, root); 
     } 

     void traverseNode() 
     { 
      traverseHelper(root); 
     } 
}; 



#endif /* BINARYTREE_H_ */ 

今私のメインのTEST.CPPは次のよ​​うになります。

#include<iostream> 
#include "BinaryTree.h" 

using namespace std; 

int main() 
{ 
    BinaryTree<int> bt; 
    bt.addNode(5); 
    bt.addNode(6); 
    bt.addNode(15); 
    bt.addNode(20); 
    bt.traverseNode(); 
    return 0; 
} 

をしかし、私は、コードを実行しようとしたとき、それは私にいくつかのエラーを示し

0 [main]コンテナ8796 cygwin_exception :: open_stackdumpfile:スタックトレースをContainers.exe.stackdumpにダンプする

エラーが発生している場所で誰でも助けてくれますか

答えて

2

作成されていない要素にアクセスしようとしています。それは私が得たエラーでした。新しいルートノードを作成したことはありません。あなたのプラットフォームにあるデバッグオプションを調べることを強くお勧めします。私はこれまでに1つ以上のエラーを打ちました。

ここにいくつかの修正手順があります。

最初に、void addNode(T value)関数では、このようなものが必要です。

void addNode(T value) 
{ 
    if (root == NULL){ 
     root = new Node<T>(); 
     root->data = value; 
     root->lChild = NULL; 
     root->rChild = NULL; 
    } 
    else{ 
     addHelper(value, root); 
    } 
} 

コンストラクタで、またはコンストラクタ内でルートノードを作成し、それを空にします。

第2位。 addhelper関数では、新しい子を最初に作成してから割り当てる必要があります。以下を参照してください

else if (leaf->lChild == NULL) 
    { 
     leaf->lChild = new Node<T>(); 
     leaf->lChild->data = value; 
     leaf->lChild->lChild = NULL; 
     leaf->lChild->rChild = NULL; 
    } 

あなたは残りのケースでそれを行う必要があります。

デバッグ中に、どのポインタがNULLで、どのポインタがNULLでないかを確認することができます。また、コードをステップバイステップで表示し、いつブレークするかを確認できます。

このヒントを参考にすれば、適切な目標を達成できます。これまでのところ、コードは非常に読みやすく、何が起こっていたのかを見るのが簡単でした。あなたはちょうどヌルのポインタに立ち往生している。

関連する問題