C++ 如何使用智能指针构建树结构?

C++ 如何使用智能指针构建树结构?,c++,c++11,smart-pointers,C++,C++11,Smart Pointers,下面是一个代码片段,我想得到一个带有智能指针的树结构。但是我在vs中得到了c3646(“父”:未知覆盖说明符)和c4430(缺少类型说明符-假定为int)。有人知道发生了什么,我如何修复它> #include<memory> class Obj { ObjPtr parent; }; typedef std::shared_ptr<Obj> ObjPtr; #包括 Obj类{ ObjPtr亲本; }; typedef std::shared_ptr ObjPt

下面是一个代码片段,我想得到一个带有智能指针的树结构。但是我在vs中得到了c3646(“父”:未知覆盖说明符)和c4430(缺少类型说明符-假定为int)。有人知道发生了什么,我如何修复它>

#include<memory>

class Obj {
    ObjPtr parent;
};
typedef std::shared_ptr<Obj> ObjPtr;
#包括
Obj类{
ObjPtr亲本;
};
typedef std::shared_ptr ObjPtr;

您的
Obj
类不知道
ObjPtr
是什么,因为您在
Obj
之后提供了typedef。您需要将其置于类定义之上,并提供一个
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
};
class Obj;//远期申报
typedef std::shared_ptr ObjPtr;//现在ObjPtr知道了Obj类
Obj类{
ObjPtr parent;//我们现在可以使用ObjPtr
};
Obj级{
公众:
使用ObjPtr=std::shared_ptr;
私人:
ObjPtr亲本;
};
不需要这么多声明。

您根本不需要typedef

类Obj{
std::共享的ptr父级;
};
但是树只需要在父->子方向拥有指针。您可以在子->父方向使用原始指针

struct Node {
    Node * parent;
    std::unique_ptr<Node> left, right;
};
struct节点{
节点*父节点;
std::唯一的左、右ptr;
};

您应该包括头文件,其中包括
ObjPtr
@Asesh的接口。我已经在class.typedef std::shared_ptr ObjPtr下面定义了它;在
typedef
之后使用
ObjPtr
,而不是相反。此外,为什么树结构会有一个
shared_ptr
你打算在不同的树之间共享节点?@alfC并且当你在类中使用
ObjPtr
时,我想typedef应该放在类的前面?是的,
unique_ptr
似乎是一个更明智的选择。如果您需要
共享\u ptr
,可以稍后更改。是的,树可以用智能指针实现。注意这一点。只是想澄清一下,使用这种方法,
ObjPtr
将无法在
Obj类之外使用
@cantordust ok,修复了这个问题。孩子是自己的父母,还是父母自己的孩子,只取决于谁需要谁活着。例如,在
git
commit DAG中,是孩子让他们的父母活着,而在
git
目录树中,是父母让他们的孩子活着。。。(
git
这里只是一个例子)。唯一重要的是,不要用智能指针构造循环。当然,你可能会说,只有父指针的对象只是一个链表,可能恰好与其他同类链表共享一个尾部。但是,一旦您向其父级注册了子级(使用普通指针),您就牢牢地进入了树区域。@cmaster是的,
shared\u ptr
更适合于一般DAG。
class Obj{
    std::shared_ptr<Obj> parent;
};
struct Node {
    Node * parent;
    std::unique_ptr<Node> left, right;
};