我对具有两种结构和类的类的复制构造函数和赋值构造函数有以下查询:指针成员变量。
这是我的班级
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;
}
我有几个问题
由于
其他问题:如果我在复制构造函数中使用了new,是否需要在析构函数中删除它?
答案 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
作为类型。