助推::shared_ptr家长><子沟通

boost::shared_ptr parent <-> child communication

本文关键字:lt gt ptr 家长 助推 shared      更新时间:2023-10-16

我使用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的临时实例来定位指针。