如何像stl迭代器一样“使对象无效”

时间:2013-06-28 19:58:21

标签: c++

模糊的标题,但有点难以解释我需要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中。你们如何保留依赖项列表,以便调解员知道还会破坏某些节点?此外,如果您以不同方式组织此计划,我也想听听它。提前谢谢!

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

1 个答案:

答案 0 :(得分:3)

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

Boost.Intrusive list与依赖节点列表的自动取消链接一起使用可能会有所帮助,因为当节点被销毁时,它会自动从列表中删除。

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

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