您描述的错误听起来像您可能想要使用正向声明而不是全部包含。这将允许您通过头文件中定义的接口中的引用或指针相互引用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
)。
你的“奇怪的错误”可能已经用前向声明解决了。至于“存储游戏对象并处理其删除的正确方式”,这完全是您要确定的事情。这种事情没有“正确的方式”或“错误的方式”。 –
小心删除别人的数据。如果一个对象在对象处理程序迭代时从矢量中移除,结果将不会很漂亮。可能更好的方法是使用'RemoveMe'方法或类似方法来通知'object_handler',在安全的情况下可以删除对象。 – user4581301