假设我有一个包含类类型“xx”的 stl 向量。xx 是抽象的。当我执行以下操作时,我遇到了编译器不允许我“实例化”的问题:
std::vector<xx> victor;
void pusher(xx& thing)
{
victor.push_back(thing);
}
void main()
{
;
}
我认为这是因为必须调用复制构造函数。我通过将 xx* 存储在向量中而不是 xx 中解决了这个问题。有更好的解决方案吗?它是什么?
假设我有一个包含类类型“xx”的 stl 向量。xx 是抽象的。当我执行以下操作时,我遇到了编译器不允许我“实例化”的问题:
std::vector<xx> victor;
void pusher(xx& thing)
{
victor.push_back(thing);
}
void main()
{
;
}
我认为这是因为必须调用复制构造函数。我通过将 xx* 存储在向量中而不是 xx 中解决了这个问题。有更好的解决方案吗?它是什么?
为了比教皇(或在本例中为 Steve Guidi)更天主教,对存储在 STL 容器中的对象的要求是它们是可复制构造和可分配的,而抽象类两者都不是。所以在这种情况下,一个指针容器是要走的路。如果您决定通过不使类抽象来解决问题,要考虑的另一件事是slicing。
std::vector(以及一般的整个 STL)旨在存储值。如果你有一个抽象类,你不打算操纵这种类型的值,而是操纵指针或对它的引用。所以有一个抽象类的 std::vector 是没有意义的。即使它不是抽象的,将设计为基类的类作为值操作通常也没有意义,它们通常应该是不可复制的(复制构造函数和赋值运算符声明为私有且未实现是标准技巧,继承自一个合适的类,其唯一目的是使其后代不可复制——例如 boost::noncopyable——已成为时尚)。