3

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

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

void main()
{
    ;
}

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

4

3 回答 3

12

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

建议使用指针,或者是boostloki等库中可用的许多智能指针类型之一。

于 2009-08-10T18:22:55.860 回答
2

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

于 2009-08-10T18:44:47.110 回答
0

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

于 2009-08-10T18:29:57.560 回答