C++ boost::共享的\u ptr循环依赖
我有一个问题,我在每个级别使用不同的类实现了一个树。 指向树项的指针是boost::shared\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
//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;
};