2015-12-14 71 views
0

我有一个object_handler类,负责处理存储在其向量中的对象。通过对象处理程序删除对象

​​

对象类是基本的实体我会在我的游戏中使用,现在我需要做的是,它能够在需要(例如删除自身,当它的健康低于零)。我认为这样做的一种方式是,如果我给对象一个指向其处理程序的指针,以便他们可以访问它们的处理程序的remove函数,但事实证明这是一场灾难:编译器开始抛出奇怪的错误(如“预期; *之前*在“object_handler * m_handler”“),我想这是因为他们包括对方。

什么是正确的方式来存储游戏对象和处理他们的删除?如果对象能够在考虑向量的情况下删除自己,那将是最有益的。

虽然它会工作的另一种方式是,如果该对象会删除自己和向量会遇到一个空指针,并删除它,但我不知道会有多好。

+0

你的“奇怪的错误”可能已经用前向声明解决了。至于“存储游戏对象并处理其删除的正确方式”,这完全是您要确定的事情。这种事情没有“正确的方式”或“错误的方式”。 –

+0

小心删除别人的数据。如果一个对象在对象处理程序迭代时从矢量中移除,结果将不会很漂亮。可能更好的方法是使用'RemoveMe'方法或类似方法来通知'object_handler',在安全的情况下可以删除对象。 – user4581301

回答

0

您描述的错误听起来像您可能想要使用正向声明而不是全部包含。这将允许您通过头文件中定义的接口中的引用或指针相互引用object_handler类和object类。实际完整包含只需要包含在实现(.cpp)文件中,并且包含的​​顺序在那里并不重要。例如:

文件object_handler.h

#include <vector> 

// NOTE: No #include here for object class, 
//  only a forward reference 

class object; 

class object_handler { 
private: 
    std::vector<object*> m_objects; 
    // ... 

public: 
    void add(object* x_object); 
    void remove(object* x_object); 
    void update(); 
    void render(); 
    // ... 
}; 

文件object.h

// NOTE: No #include here for object_handler class, 
//  only a forward reference 

class object_handler; 

class object { 
public: 
    object(object_handler& handler); 
    ~object(); 

private: 
    object_handler& m_handler; 
}; 

文件object.cpp

// NOTE: #include both headers, order doesn't matter 

#include "object.h" 
#include "object_handler.h" 

object::object(object_handler& handler) : 
    m_handler(handler) 
{ 
    m_handler.add(*this); 
} 
object::~object() 
{ 
    m_handler.remove(*this); 
} 

这是否是管理你的object情况下,将取决于以适当的方式上其余的代码。上述方法并不是那么不寻常。您可能想要探索一些例子,例如Qt的QObject层次结构,它与您的类具有相似的类别(例如,请参阅QObjectCleanupHandler)。

1

我通常在Entity类中使用标记removed(true或false)。我可以在主循环中删除它们。

你的对象删除自己的例子应该也可以,因为你可以转发声明一个类来打破循环包含。但我不会推荐这一点,因为它会使你的对象被删除的时间和地点不清楚。

+0

我编辑了答案,告诉我是否还有要添加的东西。谢谢。 –

+0

做了一个快速的错字修正和语法调整。 – user4581301