为什么访问boost :: ptr_vector的元素尝试实例化新对象?

时间:2014-05-21 09:32:56

标签: c++ boost

我已使用

更改了我的代码
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,如果我错过了一些明显的东西,请原谅我,但为什么要尝试实例化,怎么能避免呢?

2 个答案:

答案 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不可复制,因此导致错误。