为boost指针容器调用基类的复制构造函数
Invoking the copy constructor of a base class for boost pointer containers?
对于下面的代码,当复制v时,不复制Model类的成员。
#include <boost/ptr_container/ptr_vector.hpp>
#include <iostream>
using namespace std;
class SomeNewClass
{
public:
int a;
};
class Model
{
public:
int i;
SomeNewClass* s;//A deep copy won't happen here automatically
Model() {}
Model(const Model& m):i(m.i)
{
cout<<"Model Copy ctor invoked"<<endl;
}
};
class ModelInherit : public Model
{
public:
int j;
ModelInherit() {}
ModelInherit(const ModelInherit& m):j(m.j)
{
//i=m.i;//I don't want to copy like this. I want the copy ctor of Model to be invoked
cout<<"ModelInherit Copy ctor invoked"<<endl;
}
};
int main()
{
boost::ptr_vector<ModelInherit> v;
v.push_back(new ModelInherit);
v[0].j = 10;
v[0].i = 20;
v[0].s = new SomeNewClass();
v[0].s->a = 99;
boost::ptr_vector<ModelInherit> v2( v );
cout<< v2[0].j <<endl;
cout<< v2[0].i <<endl;
//cout<< v2[0].s->a <<endl;//segmentation fault
}
需要注意的是,如果注释掉ModelInherit的复制构造函数,那么指针容器会自动复制Model类中的i变量。遗憾的是"SomeNewClass* s"没有被复制。没有深度拷贝。
我的问题是:
- 你知道如何调用副本吗类中的Model类的构造函数上面的代码吗?
- 当指针容器自动复制变量时,我如何确保深度复制,以便即使是SomeNewClass的"a"变量也被复制?
(1)调用Model复制构造函数,更改ModelInherit复制构造函数,如下所示:
ModelInherit(const ModelInherit& m): Model(m), j(m.j) {}
(2)深度复制可以这样做:
Model(const Model& m): i(m.i), s(0)
{
if(m.s != 0)
this->s = new SomeNewClass(*(m.s));
cout<<"Model Copy ctor invoked"<<endl;
}
并为SomeNewClass声明复制构造函数,如下所示:
SomeNewClass(const SomeNewClass ©) : a(copy.a)
{
cout<<"SomeNewClass Copy ctor invoked"<<endl;
}
不要忘记在析构函数中释放Model::s
,否则会泄漏内存:
~Model () { delete this->s; } // it's ok if s = 0
调用基类复制构造函数很容易:
ModelInherit(const ModelInherit& m): Model(m), j(m.j) {}
//^^^^^^^^ note this
Model(m)
调用基类复制构造函数;参数m
隐式转换为基类。
在基类复制构造函数中,必须手动深度复制m.s
。
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- 基类的填充将被复制到派生类中
- 我什么时候会默认(而不是删除)基类中的复制和移动操作
- 通过基类接受方法转发派生 UniquePtr 的右值会移动引用而不是复制
- 如何复制只引用基类的派生类
- 为什么为派生类定义复制构造函数需要定义基类的默认构造函数?
- 为什么基类中的复制和交换会导致派生类中的复制赋值运算符被隐式删除?
- 不可复制基类的聚合初始化
- 有没有办法复制派生类指针的向量而不将其强制转换为基类?
- 如何保存指向抽象基类的指针/引用,但在 c++ 中仍然可以复制
- 在派生类中使用基类复制 CTOR
- 复制派生类更改基类的构造函数
- 使用 "using" 关键字继承基类的复制和移动构造函数
- 当派生类的基类具有成员指针时,对其进行深层复制
- 试图在具有std ::任何构造函数的基类中调用复制构造函数的问题
- 如何从基类 c++ 复制字段
- 用基类复制构造函数c++并派生类
- 这两种调用基类复制赋值的方法有什么区别
- 为什么隐式复制构造函数调用基类复制构造函数,而定义的复制构造函数不调用?
- 如何从派生类复制构造函数调用基类复制构造函数