2013-03-13 80 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