问题是关于C++。我有三类:第一类名为MovieMaker
,是抽象的,第二类名为Actor
,源于第一名和第三名,名为“导演”来自Actor
。我想创建一个可以容纳Actor和Director实例的数组。 我该怎么做?C++继承数组
C++继承数组
回答
创建指针阵列MovieMaker
。它可以保存派生类的指针。这种技术被称为多态性 - 这里是一个很好的教程:
cplusplus.com不好,你应该感觉不好 – 2013-03-13 13:14:14
@TonyTheLion - 真的吗?在使用stackoverflow之前,我多次用它作为参考。为什么这么糟糕? – WeaselFox 2013-03-13 13:15:10
,因为它有很多错误和错误信息。改为使用en.cppreference.com。 – 2013-03-13 13:16:26
创建的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>
的数组,它忽略类层次结构,并简单地存储类似结构的类型安全的union
。 boost::variant
是有点使用。
作为另一种替代方案,boost::any
可以存储任何东西,如果它有什么是你想要的,你可以查询它。
也许,如果所有对象都分配在堆上,并且设计需要共享所有权。但这是这个答案中的一个假设,而不是原始问题的一部分。 – 2013-03-13 13:54:12
@PeteBecker这些对象已经在'std :: vector'中,这意味着它们在免费商店中。我在'std :: vector'中添加了一个间接的级别,这对于多态存储是必需的(除非你像'boost :: variant'或'boost :: any'这样的技巧)。我选择'shared_ptr'而不是原始指针,因为原始指针更复杂。 'unique_ptr'是另一种选择。我将它存储在一个'vector'中,因为'vector'是一个很好的默认容器 - 使用原始数组有很好的理由,但它们都是角落的情况。 – Yakk 2013-03-13 14:13:51
嗯,不,它们不在'std :: vector'中。但是,如果它们是,矢量管理它们的存储,并且创建指向它们的智能指针('shared_ptr','unique_ptr'或任何其他管理存储的指针)会造成灾难。 – 2013-03-13 14:21:09
导演是演员? – 2013-03-13 13:12:26
我知道每个演员都想指导,我也不知道它也是以另一种方式去做的。 – Barmar 2013-03-13 13:13:11
我知道这不是你的问题,但你的继承层次听起来有点可疑。可能值得考虑一个不同的结构。例如,您可以尝试:MovieMaker是一个具体的类;角色是抽象的;导演和演员继承角色,每个MovieMaker *具有*数量的角色。这稍微复杂一些,但会更灵活,避免不采取行动的董事出现怪异现象。 – Weeble 2013-03-13 13:20:47