我必须使用智能指针为类创建小型二叉树。当ChildL和ChildR是公共成员并且我直接使用它们时,一切都很好,但我应该创建具有私有成员的树并通过函数访问。 控制台中的结果只是:root 你能帮助我吗 ?我正在使用visual studio 2015。
#include <iostream>
#include <memory>
#include <string>
using namespace std;
class Node
{
public:
Node(string n) : name(n) {}
shared_ptr<Node> getChildL()
{
return ChildL;
}
shared_ptr<Node> getChildR()
{
return ChildR;
}
shared_ptr<Node> createChildL(string n)
{
return shared_ptr<Node>(new Node(n));
}
shared_ptr<Node> createChildR(string n)
{
return make_shared<Node>(n);
}
string getName()
{
return name;
}
private:
string name;
shared_ptr<Node> ChildL, ChildR;
};
void PrintTree(shared_ptr<Node> tree)
{
if (tree)
{
cout << tree->getName() << endl;
PrintTree(tree->getChildL());
PrintTree(tree->getChildR());
}
}
int main()
{
shared_ptr<Node> root = make_shared<Node>("root");
root->getChildL() = root->createChildL("leaf");
PrintTree(root);
cin.get();
}
答案 0 :(得分:1)
该成员:
shared_ptr<Node> createChildL(string n) {
return shared_ptr<Node>(new Node(n));
}
不分配给ChildL
。它只是创建一个新节点,将其嵌入共享指针,然后返回它。
你可能(我想)实施:
std::shared_ptr<Node> createChildL(std::string n) {
ChildL=std::make_shared<Node>(n);
return ChildL;
}
然而,这不是最佳方式。如果您尝试做的只是封装,请考虑实现get / set对:
void setChildL(const std::shared_ptr<Node>& left) {
ChildL=left;
}
您可能希望构建一个BinaryTree
类来处理以遵循树不变量的方式插入/删除节点(例如,ChildL-&gt; n&lt; = n和ChildR-&gt; n&gt; n对于每个节点。)。