【问题标题】:Copy constructor for class with pointers and structures具有指针和结构的类的复制构造函数
【发布时间】:2015-02-26 05:58:12
【问题描述】:

我对具有结构和指针成员变量的类的复制构造函数和赋值构造函数有以下查询。

这是我的课

class myClass{                                        
       public:      
         Calculator mCalc;      // Calculator is a class that I defined elsewhere

         struct Sstatus{
             bool add_flag;
             int error_code;
             CvMat* matrix;      // I am using OpenCV here for matrix handle 
             double params[6];
         }; 

        // class function
        myClass(void);
       ~myClass(void);

       protected:
              int index;
              BasedClass*  interface;
              CvMat* matrix_int;
       private:
              int calc_index;
              bool* done;
};

而我的类函数如下

myClass::myClass(void):mCalc(0),
                       index(0),
                       matrix_int(0),
                       calc_index(0),
                       done(0)
{
        interface = new DerivedClass();     // derived class is extended by the base class
}

myClass::~myClass(void){
        delete interface;
}

// defining copy constructor
myClass::myClass(const myClass& o):mCalc(o.mCalc),
                                   index(o.index),
                                   calc_index(o.calc_index),
                                   done(o.done)
{
          // assigning new memory for member pointers for copying
              matrix_int = new CvMat();
              *matrix_int = o.matrix_int;
              interface = new DerivedClass(); 
              *interface = o.interface;
              done = new bool();
              *bool = o.done;
}

// defining assignment operator
myClass::myClass& operator=(const myClass& o)
{
        if(this != &o) 
        {
              mCalc = o.mCalc;
              index = o.index;
              calc_index = o.calc_index;

          // assigning new memory for member pointers for copying
              matrix_int = new CvMat();
              *matrix_int = o.matrix_int;
              interface = new DerivedClass(); 
              *interface = o.interface;
              done = new bool();
              *bool = o.done;

        }

        return *this;

}

我有几个问题

  1. 复制构造函数和赋值运算符应该这样编码吗?对于成员指针和数组,应该怎么做
  2. 我不太明白指针成员的赋值和复制构造函数之间的区别。跟我很像
  3. 如果我们要为结构体定义一个拷贝构造函数和赋值构造函数,应该怎么做呢?

谢谢

其他问题:如果我在复制构造函数中使用了 new,是否需要在析构函数中删除它?

【问题讨论】:

  • 不,这不是你应该编写资源拥有类的方式,使用智能指针 (unique_ptr) 来管理动态分配的成员。您看不到复制赋值和复制构造之间的区别,因为在赋值运算符的情况下,您正在泄漏数据成员已经指向的内存。阅读copy and swap idiom,在大多数情况下,这应该是您实现复制构造函数/复制赋值运算符的方式。
  • 从未见过指向bool 的指针。为什么会这样?
  • @Praetorian 不要再说当他想要动态管理内存时应该使用智能指针。这不是行业或其他什么...
  • @nbro 是的,很好的建议,干得好。坚持下去。
  • *bool = o.done; ??

标签: c++ pointers structure copy-constructor deep-copy


【解决方案1】:

您应该做的是设计您的类,使其不需要任何用户定义的复制构造函数、赋值运算符或析构函数。那么你就不可能在你的代码中为这些函数犯错误。此外,隐式生成的移动构造函数将起作用。

让我们修复您的班级以这种方式工作。我们必须处理四个指针:

bool* done;    

这很简单,只需更改为bool done;,其初始值设定项应为false。需要时设置为true

CvMat* matrix_int;
CvMat* matrix;

在您现有的代码中,您只需使用CvMat 的赋值运算符复制一个矩阵,然后默认构造它们。如果这实际上是正确的,那么您只需更改为 CvMat matrix;CvMat matrix_int; 即可解决此问题。

BasedClass*  interface;

这里有一点问题 - 因为您在这里自定义了复制行为(创建一个新的 DerivedClass 然后执行 operator=),所以没有标准的包装器。

你可以创建一个小助手类来管理这个指针。您必须为此编写复制构造函数等,但是该代码是自包含的,您不必为课程的其余部分编写一堆无用的样板代码。

注意 - 使用operator= 复制派生类是可疑的。这只有在所有对象都派生自 DerivedClass 时才有效,在这种情况下,您不妨使用 DerivedClass 作为类型。

【讨论】:

  • 只是一个查询。这是否意味着有了一个没有指针成员变量的类,就不需要(我知道 C++ 提供了默认的复制构造函数)来编写复制构造函数的代码?
  • 如果所有成员变量(和基类)都具有值语义,那么整个类也将
猜你喜欢
  • 2016-06-30
  • 2016-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多