C++ 为什么访问boost::ptr_vector的元素会尝试实例化新对象?
我已从使用C++ 为什么访问boost::ptr_vector的元素会尝试实例化新对象?,c++,boost,C++,Boost,我已从使用 std::vector<A*> 在线 sum += pv[1].getNumber(); 这是我第一次使用ptr_vector,所以如果我遗漏了一些明显的东西,请原谅我,但为什么它要尝试实例化,以及如何避免它?您不能为类使用纯虚拟且未定义的析构函数,如果您想以多态方式使用它ptr_vector应该清理它的内容(默认策略是在指针上调用delete,调用对象的析构函数,所以应该定义析构函数) 尝试在类声明之后(或在cpp文件中)定义它,如 n3376 12.4/9 析构
std::vector<A*>
在线
sum += pv[1].getNumber();
这是我第一次使用ptr_vector,所以如果我遗漏了一些明显的东西,请原谅我,但为什么它要尝试实例化,以及如何避免它?您不能为类使用纯虚拟且未定义的析构函数,如果您想以多态方式使用它
ptr_vector
应该清理它的内容(默认策略是在指针上调用delete
,调用对象的析构函数,所以应该定义析构函数)
尝试在类声明之后(或在cpp文件中)定义它,如
n3376 12.4/9
析构函数可以声明为虚拟(10.3)或纯虚拟(10.4)如果
在中创建该类或任何派生类的任何对象
程序,应定义析构函数。
有些评论是正确的,因为问题实际上在于创建对象的位置 我有一个类B,它的成员是ptr_向量。B只使用从A派生的对象填充向量,这很好
问题是在制作B的副本时出现的。由于A不可克隆,这导致了错误。如果您能显示创建A对象并将其分配给ptr_向量的代码,这将很有帮助。A有可能重现该问题吗?我试图重现编译器错误,但无法执行此操作。它与vector一起工作,因为vector不担心创建/删除。然而,从这里有限的代码示例来看,pv可以轻松地保存从派生的对象,并定义有效的析构函数。因此,我仍然不清楚为什么它无法编译。
class A
{
protected:
virtual int getNumber() {return 1;};
public:
static int getSum( boost::ptr_vector<A> &pv){
int sum = 0;
for(std::vector<int>::size_type i = 0; i != pv.size(); i++) {
sum += pv[i].getNumber();
}
return sum;
}
virtual ~A(void)=0;
}
error C2259: 'A' : cannot instantiate abstract class
due to following members:
'A::~A(void)' : is abstract
sum += pv[1].getNumber();
A::~A() {}