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