助推::shared_ptr家长><子沟通
boost::shared_ptr parent <-> child communication
我使用boost::shared_ptr在我的游戏引擎中组织我的指针数据。
我试着做一个很短的例子来说明我的问题:
class CSceneNode
{
public:
CSceneNode(CScene *p) : parent(p) {}
void foo() {
parent->notifyThatFooWasCalledOnMe(my_shared_ptr_version_of_this???);
};
CScene *parent;
};
class CScene
{
public:
void addNode() {
nodes.push_back(boost::shared_ptr<CSceneNode>(new CSceneNode(this)));
}
void notifyThatFooWasCalledOnMe(boost::shared_ptr<CSceneNode> node) {
foo_was_called[node] = true;
}
std::list<boost::shared_ptr<CSceneNode> > nodes;
std::map<boost::shared_ptr<CSceneNode>, bool> foo_was_called;
};
因此问题是:CScene创建CSceneNode's,并在boost::shared_ptr's中拥有它们。
现在子组件需要通知父组件更改。这很简单,因为我将CScene的指针传递给CSceneNode,节点知道它的父节点。由于节点的生存时间不会比父节点长,所以只传递一个指针是可以的。
但是父进程也需要知道是谁回叫了它,这就有问题了。父节点不知道原始指针,它只知道共享指针,所以找出子节点调用的唯一方法是搜索所有节点,找到内部具有相同原始指针的节点,或者创建另一个映射,从原始指针映射到shared_ptr。当节点被删除时,最后一个需要额外的维护。我也可以将shared_ptr传递给子进程本身,以帮助它将自己发送回来,但这似乎很愚蠢。
谁能告诉我该怎么做?有更好的方法吗?现在子组件需要通知父组件更改。
删除这个要求,整个问题就崩溃了…以及你的循环依赖。
您可以考虑使用基于事件的系统或状态轮询。
看起来您可能想要使用enable_shared_from_this<>,这是一种让对象知道自己的shared_ptr<>所有权的方法。
所以…
class CSceneNode : public boost::enable_shared_from_this<CSceneNode> // <- (1)
{
public:
CSceneNode(CScene *p) : parent(p) {}
void foo() {
parent->notifyThatFooWasCalledOnMe(shared_from_this()); // <- (2)
};
CScene *parent;
};
如何在您的映射中重写更少的谓词
std::map<boost::shared_ptr<CSceneNode>, bool, MyLess>
你可以通过指针来比较,所以你只需要从指针中创建shared_ptr的临时实例来定位指针。
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- ///<评论></评论>在Visual Studio中