2015-12-14 82 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