我正在使用 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 并在 boost::shared_ptr 中拥有这些到列表中。
现在 child 需要通知 parent 一个变化。这很容易,因为我将 CScene 的指针传递给 CSceneNode,该节点知道它的父节点。由于节点的生命周期不会比父节点长,因此只传递一个指针就可以了。
但是父类还需要知道是谁回调了它,这就是问题所在。 parent 不知道原始指针,它只知道共享指针,所以找出哪个 child 正在调用的唯一方法是搜索所有节点以找到内部具有相同原始指针的节点,或者从原始创建另一个映射映射指向 shared_ptr 的指针。当删除节点时,最后一个需要额外维护。我也可以将 shared_ptr 传递给 child 本身以帮助它返回自己,但这看起来很愚蠢。
谁能告诉我该怎么做?有更好的方法吗?
最佳答案
Now the child needs to notify the parent of a change.
删除这个要求,整个问题就会崩溃......以及你的循环依赖。
您可能会考虑使用基于事件的系统或状态轮询。
关于c++ - boost::shared_ptr parent <-> child 通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7348206/