Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么访问boost::ptr_vector的元素会尝试实例化新对象?_C++_Boost - Fatal编程技术网

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() {}