我已使用
更改了我的代码std::vector<A*>
使用
boost::ptr_vector<A>
并且遇到了问题。
以下是代码:
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;
}
现在,由于更改为ptr_vector,我收到编译错误:
error C2259: 'A' : cannot instantiate abstract class
due to following members:
'A::~A(void)' : is abstract
就行了
sum += pv[1].getNumber();
这是我第一次使用ptr_vector,如果我错过了一些明显的东西,请原谅我,但为什么要尝试实例化,怎么能避免呢?
答案 0 :(得分:3)
您不能为类提供纯虚拟和未定义的析构函数,您希望以多态方式使用它。 ptr_vector
应该清除其内容(默认策略是在指针上调用delete
,调用对象的析构函数,因此应该定义析构函数。)
尝试在类声明之后(或在cpp文件中)定义它,如
A::~A() {}
n3376 12.4 / 9
析构函数可以声明为虚拟(10.3)或纯虚拟(10.4); 如果 在该类中创建该类的任何对象或任何派生类 程序,应该定义析构函数。
答案 1 :(得分:0)
有些评论是正确的,因为问题实际上在于创建A对象的位置。
我有一个班级B,其中有一个ptr_vector作为成员。 B仅使用从A派生的对象填充向量,这很好。
当制作B副本时出现了问题。由于A不可复制,因此导致错误。