使用指针和结构复制类的构造函数

时间:2014-12-30 03:18:45

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

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

这是我的班级

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. 如果我们想为结构定义一个复制构造函数和赋值构造函数,应该怎么做?
  4. 由于

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

1 个答案:

答案 0 :(得分: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作为类型。