2010-10-30 54 views
1

我目前正在一個2D遊戲項目,我想從Delphi切換到C++。在Delphi中,我可以聲明一個類型爲Entity的數組,並且我可以將Entity以及從Entity派生的類的對象放入其中。C++:存儲一個類的變量與它的類型的兒童

這對我來說非常重要,因爲所有實體應該在一個地方進行存儲和管理似乎是合乎邏輯的。

  • 這是可能的C + +?
  • (爲什麼不,如果它是在Delphi?)

  • 什麼其他的選擇來實現類似的做我有什麼?

我需要做類似如下:

#include <vector> 
using namespace std; 

class Entity 
{ 
public: 
int id; 
}; 

class Camera : Entity 
{ 
public: 
int speed; 
}; 

int main() 
{ 
Entity point; 
Camera camera; 

vector<Entity> vec; 

vec.push_back(point); 
vec.push_back(camera); //Why can't I do that? 
} 

我希望我使自己不夠清楚,我真的很感激你的幫助

+0

我想起了一個問題:你有 - 要 - 切換到C++,還是要切換?如果前者是真的,我建議留在德爾福。你會遇到「赤裸裸的」C++的許多微妙之處,在這個問題中描述的C++是相當無害的。 C++是一個功能非常強大的語言,它具有許多令人驚歎的功能 - 但是,我很抱歉,只有熟練和有經驗的專家纔會使用它。我正在寫這篇文章,作爲在C++工作多年的工業軟件開發人員,仍然沒有停下來發現語言的後臺...... – 2010-11-01 09:59:07

回答

5

使用boost::ptr_vector <實體>到存儲多態對象,或智能指針的容器,例如矢量< boost :: shared_ptr <實體>>,如果你需要在別處共享/移動它們。

0

我想你正在尋找C++模板。

+3

模板將如何提供幫助? Fred想要存儲兩種不同類型的對象(通過繼承關聯)。 – 2010-10-30 11:17:36

5

...因爲(沒有更多修飾符),所有C++類型都是值類型,用Delphi或C#來講。你基本上是這樣做的:

point = camera; 

這個語句調用編譯器生成的賦值運算符:

Entity& Entity::operator(const Entity& pOther) ... 

這工作,因爲const Camera&可轉換爲const Entity&。但是在作業內部沒有關於對象'Camera'部分的信息,pOther被「切片」爲Entity對象。您告訴您要處理的對象引用類型(指針)的C++ compliler獲取所需的行爲:

int main() 
{ 
vector<std::shared_ptr<Entity> > vec; 

vec.push_back(std::shared_ptr<Entity>(new Point)); 
vec.push_back(std::shared_ptr<Entity>(new Camera)); 
} 
1

你的問題是,你是混合的方式Delphi和C++處理的對象。

在C++中的情況下一個類的實例可以以三種方式使用:

  • 作爲值
  • 作爲參考
  • 作爲指針

只有最後兩個方式表達與您從Delphi代碼期望的行爲相同。

在你的榜樣,你是創造價值的對象,這意味着,當你嘗試將攝像機分配給一個實體,實體的子部分屬於相機被複制,但沒有別的。

你應該改變你的代碼使用指針代替,

int main() 
{ 
Entity* point = new Entity; 
Camera* camera = new Camera; 

vector<Entity*> vec; 

vec.push_back(point); 
vec.push_back(camera); 

// don't forget to delete them, when you're done with the list 
for (vector<Entity*>::iterator iter = vec.begin(); iter != vec.end(); ++iter) 
    delete (*iter); 
} 
enter code here 

爲了避免直接指針搞亂,更現代的C++成語是使用智能指針。如paul_71的答案所示。