您描述的錯誤聽起來像您可能想要使用正向聲明而不是全部包含。這將允許您通過頭文件中定義的接口中的引用或指針相互引用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