【发布时间】:2023-03-11 05:12:01
【问题描述】:
我正在使用 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 中拥有这些到一个列表中。
现在孩子需要通知父母发生变化。这很容易,因为我将 CScene 的指针传递给 CSceneNode,节点知道它的父节点。由于节点不会比父节点活得更长,因此只需传递一个指针即可。
但父母也需要知道是谁回调它,这就是问题所在。父级不知道原始指针,它只知道共享指针,因此找出正在调用哪个子级的唯一方法是搜索所有节点以找到内部具有相同原始指针的节点,或者从原始指针创建另一个映射映射指向 shared_ptr 的指针。当一个节点被删除时,最后一个需要额外的维护。我也可以将 shared_ptr 传递给孩子本身,以帮助它把自己送回去,但这似乎很愚蠢。
谁能告诉我该怎么做?有没有更好的方法来做到这一点?
【问题讨论】:
标签: c++ boost parent-child shared-ptr