复制带有指针和结构的类的构造函数

Copy constructor for class with pointers and structures

本文关键字:构造函数 结构 指针 复制      更新时间:2023-10-16

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

这是我的班级

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,是否需要在析构函数中删除它?

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

让我们修复您的类以这种方式工作。我们必须处理四个要点:

bool* done;    

这很容易,只需更改为 bool done; 并且其初始值设定项应false。设置为在需要时true

CvMat* matrix_int;
CvMat* matrix;

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

BasedClass*  interface;

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

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

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