stl vector.push_back()抽象类不编译

时间:2009-08-10 18:19:39

标签: c++ stl vector copy-constructor

假设我有一个包含类类型“xx”的stl向量。 xx是抽象的。我遇到过这样的问题:当我执行以下操作时,编译器不会让我“实例化”:

std::vector<xx> victor;
void pusher(xx& thing)
{
    victor.push_back(thing);
}

void main()
{
    ;
}

我认为这是因为必须调用复制构造函数。我通过将xx *存储在向量而不是xx中来解决这个问题。有更好的解决方案吗?它是什么?

3 个答案:

答案 0 :(得分:12)

当您使用push_back时,您正在制作对象的副本并将其存储在向量中。正如你推测的那样,这不起作用,因为你无法实例化一个抽象类,这基本上就是复制结构正在做的事情。

建议使用指针,或者boostloki等库中提供的众多智能指针类型之一。

答案 1 :(得分:2)

为了比教皇(或在本例中为Steve Guidi)更加天主教,对存储在STL容器中的对象的要求是它们是可复制构造和可分配的,而抽象类也不是。所以在这种情况下,指针容器是要走的路。 如果您决定通过不使类抽象来解决问题,则需要考虑的另一件事是slicing

答案 2 :(得分:0)

std :: vector(通常是整个STL)用于存储值。如果您有一个抽象类,则不打算操纵此类型的值,而是操纵指针或对它的引用。所以有一个抽象类的std :: vector没有意义。即使它不是抽象的,将操作设计为基类的类作为值通常也没有意义,它们通常应该是不可复制的(复制构造函数和赋值操作符声明为私有而未实现是标准技巧,继承自一个合适的类,其唯一的目的是使其后代不可复制 - 例如boost :: noncopyable - 已成为时尚)。