2012-07-17 55 views
2

有人可以告訴我,並提供一個代碼示例,是否有可能創建一個數組,可以容納任何類型的對象,而無需在C++中使用繼承?我還沒有爲它編寫任何代碼,但例如,如果我有兩個類:RangedWeap和MeleeWeap,有沒有辦法將這些對象存儲在同一個數組中而不使用繼承?用於保存C++中的任何對象的數組?

+0

你不想使用繼承的特殊原因? – Kevin 2012-07-17 17:54:30

+2

使用正確的繼承模型,並節省使用'void *'的工作頭痛。 – 2012-07-17 17:55:19

+0

被告知遊戲引擎的繼承速度很慢 – Danny 2012-07-17 17:55:27

回答

7

如果你想存儲對象,沒有。原因是數組將對象存儲在連續的內存中,並且每個存儲的對象的大小是相同的。這不一定適用於不同的類型。

有一個醜陋的方式來存儲void*,但這將存儲指針,而不是對象。此外,這將是無用的,因爲所有類型的信息都會丟失。如何在世界範圍內確定void*指向什麼(假設您沒有基類)?

0

你將有一個很難的兩個物體之間的區分,但鑑於你有一個方法,你可以使用一個union

struct A 
{ 
    int type; // to distinguish 
    ... 
}; 

struct B 
{ 
    int type; 
    ... 
}; 

union AB 
{ 
    int type; 
    A a; 
    B b; 
}; 

AB array[] = {<whatever>}; 

之後,你必須檢查type當您訪問,要知道你是否應該訪問每個元素中的ab

注意:你的對象應該是POD,除非你是根據@chris using C++11

+0

一旦你開始有構造函數的類,不要聯合失敗? – Lalaland 2012-07-17 17:57:01

+0

你不能有一個非POD類型作爲工會成員,所以這隻會讓你走得這麼遠。儘管如此,這是一個創造性的解決方案。 – 2012-07-17 17:58:01

+0

@EthanSteinberg,好點。 – Shahbaz 2012-07-17 17:58:49

2

Boost.Any將啓用此功能,但它(可能?)在引擎蓋下使用繼承,如果你在意的話。