【发布时间】:2021-12-30 15:14:05
【问题描述】:
我想从一个文档构建一个 n-arry 树。为此,我有 3 种不同类型的树元素:
- 结构节点
- 有名字
- 可以包含其他节点
- 深度
- 元素节点(树的叶子)
- 有钥匙
- 有一个价值
- 深度
- 元素模板节点(树的叶子)
- 有一个占位符,应该稍后在程序中解决
- 深度
此刻我在想这样的事情:
class Node {
public:
Node(int depth);
int depth() const;
private:
int depth_;
};
class StructNode : public Node {
...
private:
std::vector<std::unique_ptr<Node>> children;
};
class ElementNode : public Node {
...
};
class ElementTemplateNode : public Node {
...
};
树将在启动时从文件生成,并重复使用以创建如下输出字符串:
Structname:
key = value
key = value
Structname:
key = value
Structname:
key = value
...
哪里的Key和value直接从ElementNode读取或者从另一个文件读取placeholder的值在ElementTemplateNode里面
树有更好的结构吗?因为对于当前的,我必须先检查它是 StructNode、ElementNode 还是 ElementTemplateNode
【问题讨论】:
-
有趣的是你必须检查类型。听起来像一个多态性问题。也许更多地谈论它的那个方面。你在做什么操作需要检查Node的具体类型?
-
首先,一旦您拥有继承并通过指向基类的指针保留对象,您就必须向基类添加虚拟析构函数,在您的情况下为
Node。 -
std::vector<std::unique_ptr<Node>> children;小心这个。虽然这个构造是正确的,但如果你的结构深入增长,你可能会因为一长串独特的 ptr 破坏它们的孩子而导致析构函数溢出堆栈。而且您的基础结构缺少虚拟析构函数。 -
顺便说一句,我不完全确定,但是像boost::property_tree 这样的东西不能满足你的需要吗?
-
@alagner 存储孩子的更好的方法是什么?
标签: c++ data-structures