为boost指针容器调用基类的复制构造函数

Invoking the copy constructor of a base class for boost pointer containers?

本文关键字:基类 复制 构造函数 调用 boost 指针      更新时间:2023-10-16

对于下面的代码,当复制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 &copy) : 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