gpt4 book ai didi

c++ - 在 C++ 中的模板中声明另一个模板变量

转载 作者:行者123 更新时间:2023-11-30 03:28:18 25 4
gpt4 key购买 nike

我对模板编程完全陌生。所以我从一些基本的模板编程开始。我制作了一个头文件 BinaryTree.h,其中出现了一些错误。请看下面我的代码:

#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] Containers 8796 cygwin_exception::open_stackdumpfile: Dumping stack trace to Containers.exe.stackdump

任何人都可以帮助我解决错误

最佳答案

您正在尝试访问尚未创建的元素。那是我得到的错误。您从未创建过新的 Root 节点。我强烈建议查看您的平台具有的任何调试选项。到目前为止,我遇到了不止 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);
}
}

要么那样,要么在你的构造函数中,创建一个根节点并让它为空。

第二。在您的 addhelper 函数中,您需要先创建新的子项,然后再分配它们。见下文

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

然后您需要为其余案例执行此操作。

在调试期间,您可以看到哪些指针为 NULL,哪些不是,您可以逐步查看您的代码并查看它何时中断。

希望这些提示能让您走上正轨。到目前为止做得很好,代码可读性很强,很容易看出发生了什么。你只是陷入了空指针。

关于c++ - 在 C++ 中的模板中声明另一个模板变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46701023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com