如何用智能指针构造树结构?
Posted
技术标签:
【中文标题】如何用智能指针构造树结构?【英文标题】:How to construct a tree structure with smart pointer? 【发布时间】:2018-07-31 03:33:29 【问题描述】:这是一个代码 sn-p,我想获得一个带有智能指针的树结构。但我在 vs 中得到了 c3646('parent': unknown override specifier) 和 c4430(missing type specifier - int)。有人吗知道发生了什么以及如何解决它>?
#include<memory>
class Obj
ObjPtr parent;
;
typedef std::shared_ptr<Obj> ObjPtr;
【问题讨论】:
你应该包含包含ObjPtr
接口的头文件
@Asesh 我已经在 class.typedef std::shared_ptrtypedef
之后使用ObjPtr
,而不是相反。此外,为什么一个树结构会有一个shared_ptr
你打算在不同的树之间共享节点吗?
@alfC 当你在类中使用ObjPtr
within 时,我想 typedef 最好放在类的前面?
是的,unique_ptr
似乎是一个更明智的选择。如果您需要shared_ptr
,您可以稍后更改。是的,可以使用智能指针来实现树。观看此youtube.com/watch?v=JfmTagWcqoE。
【参考方案1】:
您的Obj
类不知道ObjPtr
是什么,因为您提供了typedef after Obj
。您需要将其放在类定义之上并提供Obj
的前向声明:
class Obj; // Forward declaration
typedef std::shared_ptr<Obj> ObjPtr; // Now ObjPtr knows about class Obj
class Obj
ObjPtr parent; // We can now use ObjPtr
;
【讨论】:
【参考方案2】:class Obj
public:
using ObjPtr = std::shared_ptr<Obj>;
private:
ObjPtr parent;
;
不需要这么多声明。
【讨论】:
澄清一下,使用这种方法ObjPtr
将无法在class Obj
之外使用。
@cantordust 好的,已解决。【参考方案3】:
你根本不需要 typedef
class Obj
std::shared_ptr<Obj> parent;
;
但是一棵树只需要在父->子方向拥有指针。您可以在子级 -> 父级方向中使用原始指针
struct Node
Node * parent;
std::unique_ptr<Node> left, right;
;
【讨论】:
是孩子拥有父母,还是父母拥有孩子,只取决于谁需要谁来维持生命。例如,在git
提交 DAG 中,是孩子让他们的父母活着,但在 git
目录树中,是父母让他们的孩子活着......(git
只是一个例子) .唯一重要的是,不要用智能指针构造循环。
当然,您可能会争辩说,只有父指针的对象只不过是一个链表,它可能碰巧与其他一些相同类型的链表共享一个尾部。但是,一旦您向其父级注册子级(使用普通指针),您就牢牢地处于树的领域。
@cmaster 是的,shared_ptr
更适合一般 DAG。以上是关于如何用智能指针构造树结构?的主要内容,如果未能解决你的问题,请参考以下文章