2013-03-13 50 views
0

問題是關於C++。我有三類:第一類名爲MovieMaker,是抽象的,第二類名爲Actor,源於第一名和第三名,名爲「導演」來自Actor。我想創建一個可以容納Actor和Director實例的數組。 我該怎麼做?C++繼承數組

+4

導演是演員? – 2013-03-13 13:12:26

+3

我知道每個演員都想指導,我也不知道它也是以另一種方式去做的。 – Barmar 2013-03-13 13:13:11

+1

我知道這不是你的問題,但你的繼承層次聽起來有點可疑。可能值得考慮一個不同的結構。例如,您可以嘗試:MovieMaker是一個具體的類;角色是抽象的;導演和演員繼承角色,每個MovieMaker *具有*數量的角色。這稍微複雜一些,但會更靈活,避免不採取行動的董事出現怪異現象。 – Weeble 2013-03-13 13:20:47

回答

3

創建指針陣列MovieMaker。它可以保存派生類的指針。這種技術被稱爲多態性 - 這裏是一個很好的教程:

http://www.cplusplus.com/doc/tutorial/polymorphism/

+0

cplusplus.com不好,你應該感覺不好 – 2013-03-13 13:14:14

+0

@TonyTheLion - 真的嗎?在使用stackoverflow之前,我多次用它作爲參考。爲什麼這麼糟糕? – WeaselFox 2013-03-13 13:15:10

+0

,因爲它有很多錯誤和錯誤信息。改爲使用en.cppreference.com。 – 2013-03-13 13:16:26

3

創建的std::shared_ptr<MovieMaker>,或unique_ptr數組。在C++中,它通常是一個好主意,以創建一個std::vector代替原始數組:所以std::vector<std::shared_ptr<MovieMaker>> vec,你填寫這樣的:

#include <vector> 
#include <memory> 

// later: 
std::vector<std::shared_ptr<MovieMaker>> vec; 
vec.push_back(std::make_shared<Actor>()); 
vec.push_back(std::make_shared<Director>()); 
vec.push_back(std::make_shared<Actor>()); 

,或者在C++ 11:

#include <vector> 
#include <memory> 

// later: 
std::vector<std::shared_ptr<MovieMaker>> vec = { 
    std::make_shared<Actor>(), 
    std::make_shared<Director>(), 
    std::make_shared<Actor>(), 
}; 

如果您願意使用第三方庫boost,還有其他幾個選項。

或者,創建一個boost::variant<Actor,Director>的數組,它忽略類層次結構,並簡單地存儲類似結構的類型安全的unionboost::variant是有點使用。

作爲另一種替代方案,boost::any可以存儲任何東西,如果它有什麼是你想要的,你可以查詢它。

+0

也許,如果所有對象都分配在堆上,並且設計需要共享所有權。但這是這個答案中的一個假設,而不是原始問題的一部分。 – 2013-03-13 13:54:12

+0

@PeteBecker這些對象已經在'std :: vector'中,這意味着它們在免費商店中。我在'std :: vector'中添加了一個間接的級別,這對於多態存儲是必需的(除非你像'boost :: variant'或'boost :: any'這樣的技巧)。我選擇'shared_ptr'而不是原始指針,因爲原始指針更復雜。 'unique_ptr'是另一種選擇。我將它存儲在一個'vector'中,因爲'vector'是一個很好的默認容器 - 使用原始數組有很好的理由,但它們都是角落的情況。 – Yakk 2013-03-13 14:13:51

+0

嗯,不,它們不在'std :: vector'中。但是,如果它們是,矢量管理它們的存儲,並且創建指向它們的智能指針('shared_ptr','unique_ptr'或任何其他管理存儲的指針)會造成災難。 – 2013-03-13 14:21:09