1

模糊的标题,但是用 100 个字符来解释我需要什么有点困难。我有一张地图,每个地图都包含不同类型的派生对象。看起来像这样:

/* will use smart pointers in the final product, just using plain 
   pointers to simplify the example.*/

// The long is a type id and the string is a unique identifier
std::map<long, std::map<std::string, Node *> > m_NodeList;

这些节点中的每一个都包含一个或多个组件,具体取决于它们的特定类型。这些组件位于地图中的不同地图中。看起来像这样。

std::map<long, std::map<std::string, Component *> > m_ComponentList;

这种交互的一个例子是这样的:

class Mesh :
    public Component
{
    // some graphics api stuff
};

class Vector3 :
    public Component
{
public:
    float x, y ,z;
};

class Graphics :
    public Node
{
public:
    Node(Vector3 & vec, Mesh & model) :
        m_Pos(vec),
        m_Model(model)
        {}

    Vector3 & m_Pos;
    Mesh & m_Model;
};

我已经解决了很多类型的魔法,因为我以前做过类似的事情,但现在我遇到了依赖问题。我希望组件和节点能够在任何给定时间从系统中删除。然而,节点总是依赖于组件的存在。逻辑是这样的,如果一个节点被删除,没有变化,如果一个组件被删除,我还需要删除所有依赖它的节点。假设这两个映射都存在于一个对象调用 Mediator 中。你们将如何保留依赖项列表,以便中介知道也要销毁某些节点?另外,如果你想以不同的方式组织这个计划,我也想听听。提前致谢!

编辑:如果你能想到一个更相关的标题,谢谢-_-

4

1 回答 1

3

组件将需要指向所有依赖节点并在销毁自身时将其删除。创建或销毁依赖节点时需要通知组件,以便组件可以更新所有依赖节点的列表。

对依赖节点列表使用带有自动取消链接的Boost.Intrusive 列表可能是有益的,因为当一个节点被销毁时,它会自动从列表中删除。

使用自动取消链接而不是 std::map 将节点存储在 Boost.Intrusive 集中也可能会有所帮助。

请注意,要从侵入式容器中删除节点,您不需要指向容器本身的指针。您只需删除节点,它就会自动删除。

于 2013-06-28T20:15:00.500 回答