使不同子类的实例的向量(Making a vector of instances of differ

2019-06-24 00:03发布

试图寻找,没有返回(我我思)。

是否有可能使一个抽象类的载体?

例如,我有超类股。

和我有子类士兵,车辆和轰炸机。

不过,我想在一个向量任何子类的实例过,如UnitList矢量可以容纳两个士兵和车辆的情况?

这可能吗? 我使用的是C ++,如果有帮助。

Answer 1:

是的,但你需要为使用指针或智能指针(我会去与此)。

struct X
{
    virtual ~X() {}  //<--- as pointed out in the comments
                     // a virtual destructor is required
                     // for correct deletion
    virtual void foo() = 0;
};
struct Y : X
{
    virtual void foo() { }
};

int main()
{
    std::vector<X*> a;
    a.push_back(new Y);
    a[0]->foo();
    for ( int i = 0 ; i < a.size() ; i++ )
        delete a[i];
    return 0;
}

不要忘了删除分配的内存。

为什么你不能使用实际的对象:

假设std::vector<X> 这是因为非法的:

  1. 如果你想初始化一些数量的元素的矢量,分配将失败。 一种载体,存储在连续存储器内部的物体。 预分配将失败,因为这将意味着它需要创建对象,不能为抽象类来完成。

  2. 即使你能,或基类是不是抽象的,它不会帮助太多,因为你会从对象切片受到影响。



Answer 2:

由于每个这些对象是不同的尺寸,做到这一点的适当的方式是包含指向基类的一个容器Unit ,(并确保它有一个virtual析构函数。

选项1: boost::ptr_vector (需要Boost库,你应该有反正)

ptr_vector<Unit> units;
units.push_back(new Soldier());

选项2: std::vector<std::unique_ptr<Unit>> (需要C ++ 11编译器)

std::vector<std::unique_ptr<Unit>> units;
units.emplace_back(std::unique_ptr<Unit>(new Soldier()));


Answer 3:

你不能随便创建一个抽象类的物体的向量,因为向量模板需要能够告诉编译器在编译时,其元素的大小。 但是,你可以让你通过保持指针的向量对象,而不是对象作为这样的一个载体想要什么。

更新:抽象阶级作为阶级已经知道大小。 它实际上是他们最派生类型,其大小是在编译时未知的情况下。 (感谢@LuchianGrigore和@MooingDuck指出这一点。)



Answer 4:

我不认为这是可能做到这一点:

std::vector<Unit> unit_list;
unit_list.push_back(Soldier(params));

因为士兵,车辆和单位采取了不同的内存量。

然而,有可能使用指针,因为所有的指针占用固定的内存量:

std::vector<Unit*> unit_list;
unit_list.push_back(new Soldier(params));

我没有测试它,但它在我的头上是有道理的反正。



文章来源: Making a vector of instances of different subclasses