【发布时间】:2021-06-08 08:37:01
【问题描述】:
我必须为我的一个班级用 C++ 实现一个通用树,但遇到了一个我不明白的问题。
我有两个班级,EmployeeNode 和 EmpoyeeTree。
EmployeeNode 包含工作所需的数据元素:一个字符串name、一个EmployeeNode 父级和一个List<EmployeeNode> 子级,这是我之前实现的链表,据说可以与任何模板对象一起使用。
这是我目前的代码:
class EmployeeTree;
class EmployeeNode {
public:
EmployeeNode(std::string name, EmployeeNode* parent, List<EmployeeNode>* child);
~EmployeeNode();
void setChild(EmployeeNode newEmployee) {child->insert(newEmployee);}
List<EmployeeNode>* getChild() {return(child);}
bool hasChild() {return (child != 0);}
std::string getName() {return name;}
private:
std::string name;
EmployeeNode *parent;
List<EmployeeNode> *child;
};
EmployeeNode::EmployeeNode(std::string employeeName, EmployeeNode* employeeParent, List<EmployeeNode>* employeeChildren)
:name(employeeName), parent(employeeParent), child(employeeChildren)
{
employeeChildren = new List<EmployeeNode>;
}
EmployeeNode::~EmployeeNode() {}
class EmployeeTree {
public:
EmployeeTree();
~EmployeeTree();
void hireEmployee(EmployeeNode *newEmployee);
void hireEmployee(EmployeeNode* boss, std::string newEmployee);
EmployeeNode find(std::string employee);
void print(EmployeeTree Tree);
private:
int level, age;
EmployeeNode *root;
};
EmployeeTree::EmployeeTree()
:root(0)
{}
EmployeeTree::~EmployeeTree()
{}
void EmployeeTree::hireEmployee(EmployeeNode *newEmployee)
{
root = newEmployee;
}
void EmployeeTree::hireEmployee(EmployeeNode* boss, std::string newEmployee)
{
EmployeeNode* newChild;
if (!boss->hasChild()){
newChild = new EmployeeNode(newEmployee, boss, 0);
boss->setChild(*newChild);
}
else {
newChild = new EmployeeNode(newEmployee, boss, boss->getChild());
boss->setChild(*newChild);
}
}
EmployeeNode EmployeeTree::find(std::string employee) {
if(root->getName() == employee)
return *root;
else if (root->getChild()) {
List<EmployeeNode> *children = root->getChild();
children->gotoBeginning();
for(children->getCursor(); children->getCursor().getName() == employee ;children->gotoNext())
*root = children->getCursor();
return(*root);
}
else {std::cout << "Boss not found in employee tree." << std::endl;}
return(*root);
}
目前,我只是在尝试一些基本命令来测试我的工作。我首先使用hireEmployee(EmployeeNode *newEmployee) 创建根EmployeeNode,然后尝试使用hireEmployee(EmployeeNode *boss, std::string newEmployee) 向其中添加一个孩子,但我收到一个错误消息,告诉我我尝试将孩子添加到一个不存在的孩子列表中。我检查了,但我不明白我的错误在哪里或是什么。
在用断点调试的时候,发现每次创建后,List<EmployeeNode>就自动销毁了。
我认为我在没有完全理解指针的情况下玩了太多,但现在我坚持这样做了。
【问题讨论】:
-
boss->setChild(*newChild)可能不会做你想做的事。 -
谢谢,我要去看看这个!
-
employeeChildren = new List<EmployeeNode>;的预期用途是什么?目前它只是覆盖函数参数,而不是成员变量,所以它做的唯一有意义的事情就是泄漏内存。
标签: c++ data-structures tree member-function-pointers