C++ boost::共享的\u ptr循环依赖

C++ boost::共享的\u ptr循环依赖,c++,tree,include,shared-ptr,C++,Tree,Include,Shared Ptr,我有一个问题,我在每个级别使用不同的类实现了一个树。 指向树项的指针是boost::shared\u ptr 由于每个级别都存储一个指向父级的指针和一个指向其子级的指针,因此头文件中存在循环依赖关系 代码如下所示: //A.hpp class A { List<boost::shared_ptr<B> > children; }; //B.hpp class B{ boost::shared_ptr<A> parent; }; //A.hp

我有一个问题,我在每个级别使用不同的类实现了一个树。 指向树项的指针是boost::shared\u ptr

由于每个级别都存储一个指向父级的指针和一个指向其子级的指针,因此头文件中存在循环依赖关系

代码如下所示:

//A.hpp
class A
{
    List<boost::shared_ptr<B> > children;
};

//B.hpp
class B{
   boost::shared_ptr<A> parent;

};
//A.hpp
甲级
{
列出儿童名单;
};
//水电站
B类{
boost::共享\u ptr父级;
};
因为我使用boost::shared_ptr,所以无法在B.hhp中使用转发声明。但我不知道如何解决这个问题。如果您能帮助我,那就太好了。

您应该在
B
中使用a来打破这个循环:

//A.hpp
class A
{
    List<boost::shared_ptr<B> > children;
};

//B.hpp
class B
{
   boost::weak_ptr<A> parent;
};
//A.hpp
甲级
{
列出儿童名单;
};
//水电站
B类
{
boost::弱\u ptr到
boost::使用
lock()
方法共享\u ptr

因为我使用boost::shared_ptr,所以无法在B.hhp中使用转发声明

这是不正确的。声明
共享\u ptr
不应要求指向的类型完整:

#include <boost/shared_ptr.hpp>

class A;

int main()
{
    boost::shared_ptr<A> pA; // OK
}

class A { };

从子级到父级的指针(树上的指针)应该是s。这将有效地打破循环依赖,同时仍然可以通过boost::shared_ptrs(通过弱_ptr::lock()函数)访问父级.

这是智能指针的经典。您必须以某种方式在某些方向上使用
弱\u ptr
来打破依赖关系

它的工作方式是
弱\u ptr
不包含指向指向对象的引用。但是您可以在任何给定时间通过调用其
.lock()
函数获得
共享的\u ptr
。您必须小心,尽管在
共享的\u ptr
以某种方式过期后不要调用
.lock()

我使用这种机制的方式如下:你的父母总是给你的孩子留下一个
共享的ptr
,你的孩子总是给你的父母留下一个
弱的ptr
。所以你永远不会有循环依赖,因为你不能在你的层次结构中进行硬链接

这样做是有意义的(但可能会根据您的具体情况而有所不同):如果子对象存在,那么父对象必须仍然存在,因此在
弱\u ptr
上调用
.lock()
不会失败


您可以在。

提示中了解有关
弱\u ptr
等的更多信息:孩子们拥有父对象吗?如果没有,那么为什么他们拥有指向父对象的指针?当然孩子们不应该拥有父对象,我需要另一种指针吗?为什么不是指向类a的常规指针?我不能使用指向对象的常规指针,当我对同一个对象使用了shared_ptr。@Thorsten:是的,你可以,只要他们不共享所有权。而且由于他们不拥有父对象……这个解决方案似乎可以编译,我还没有检查依赖关系。感谢你和所有其他人的快速响应。现在应该了解有关智能指针的更多信息;)
//A.hpp
class A
{
    List<boost::shared_ptr<B> > children;
};

//B.hpp
class B{
   boost::weak_ptr<A> parent;
};