如何用智能指针构造树结构?

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_ptr ObjPtr; 下定义了它 typedef 之后使用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。

以上是关于如何用智能指针构造树结构?的主要内容,如果未能解决你的问题,请参考以下文章

C++11 智能指针和多态性

C++原生指针,引用与智能指针

进入智能指针,如何处理表示所有权?

第20课 unique_ptr独占型智能指针

智能指针总结

C11新特性之智能指针