C++ 在C+;中的模板内声明另一个模板变量+;
我对模板编程一无所知。所以我从一些基本的模板编程开始。我制作了一个头文件BinaryTree.h,其中有一些错误。请看下面我的代码:C++ 在C+;中的模板内声明另一个模板变量+;,c++,c++11,templates,C++,C++11,Templates,我对模板编程一无所知。所以我从一些基本的模板编程开始。我制作了一个头文件BinaryTree.h,其中有一些错误。请看下面我的代码: #ifndef BINARYTREE_H_ #define BINARYTREE_H_ #include <cstdlib> #include<ctime> template<typename T> struct Node { T data; Node *lChild; Node *rChild;
#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_ */
\ifndef二进制树_
#定义二叉树_
#包括
#包括
模板
结构体类型
{
T数据;
节点*lChild;
节点*rChild;
};
模板
类二叉树
{
私人:
节点*根;
void addHelper(T值,节点*叶)
{
if(leaf==NULL)
{
叶->数据=值;
leaf->lChild=NULL;
叶->rChild=NULL;
}
else if(leaf->lChild==NULL)
{
叶->lChild->数据=值;
leaf->lChild->lChild=NULL;
leaf->lChild->rChild=NULL;
}
else if(叶->rChild==NULL)
{
leaf->rChild->data=值;
leaf->rChild->lChild=NULL;
leaf->rChild->rChild=NULL;
}
其他的
{
srand((int)时间(0));
int i=rand()%2;
如果(i==0)
{
addHelper(值,叶->lChild);
}
其他的
{
addHelper(值,叶->rChild);
}
}
}
void transversehelper(节点*叶)
{
if(leaf==NULL)
返回;
traverseHelper(叶->叶);
traverseHelper(叶->rChild);
std::cout数据;
}
公众:
二叉树()
{
root=NULL;
}
void addNode(T值)
{
addHelper(值,根);
}
void transversenode()
{
遍历帮助器(根);
}
};
#endif/*二进制树*/
现在,我的主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;
}
#包括
#包括“BinaryTree.h”
使用名称空间std;
int main()
{
二叉树;
bt.addNode(5);
bt.addNode(6);
bt.addNode(15);
bt.addNode(20);
bt.traverseNode();
返回0;
}
但是当我试图运行代码时,它显示了一些错误
0[main]Containers 8796 cygwin_异常::open_stackdumpfile:将堆栈跟踪转储到Containers.exe.stackdump
有人能帮我找到错误的地方吗?您试图访问一个尚未创建的元素。这就是我犯的错误。您从未创建过新的根节点。我强烈建议您查看平台上的任何调试选项。到目前为止,我犯了不止一个错误 下面是一些需要修复的步骤 首先,在
void addNode(T值)
函数中,您将需要类似的内容
void addNode(T value)
{
if (root == NULL){
root = new Node<T>();
root->data = value;
root->lChild = NULL;
root->rChild = NULL;
}
else{
addHelper(value, root);
}
}
void addNode(T值)
{
if(root==NULL){
根=新节点();
根->数据=值;
root->lChild=NULL;
root->rChild=NULL;
}
否则{
addHelper(值,根);
}
}
或者,在构造函数中,创建一个根节点,让它为空
第二。在addhelper函数中,您需要先创建新的子对象,然后再分配它们。见下文
else if (leaf->lChild == NULL)
{
leaf->lChild = new Node<T>();
leaf->lChild->data = value;
leaf->lChild->lChild = NULL;
leaf->lChild->rChild = NULL;
}
else if(leaf->lChild==NULL)
{
leaf->lChild=新节点();
叶->lChild->数据=值;
leaf->lChild->lChild=NULL;
leaf->lChild->rChild=NULL;
}
然后,你需要在剩下的案件中这样做
在调试过程中,您可以看到哪些指针是空的,哪些不是空的,并且可以逐步查看代码并查看它何时中断
希望这些建议能让你走上正轨。到目前为止做得很好,代码可读性很强,很容易看到发生了什么。你只是被空指针卡住了