复制带有指针和结构的类的构造函数
Copy constructor for class with pointers and structures
我对具有结构和指针成员变量的类的复制构造函数和赋值构造函数有以下查询。
这是我的班级
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,是否需要在析构函数中删除它?
你应该做的是设计你的类,使其不需要任何用户定义的复制构造函数、赋值运算符或析构函数。然后,您就不可能在这些函数的代码中犯错误。此外,隐式生成的移动构造函数将起作用。
让我们修复您的类以这种方式工作。我们必须处理四个要点:
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++ 中将变量作为结构构造函数中的引用传递
- 在类构造函数中定义结构变量的参数
- 我应该在C++中将这些结构用作参数化构造函数吗?
- 初始化构造函数C++中结构的向量
- C++ 带有默认参数的结构,可选择在构造函数中更改
- 我们可以用参数化构造函数初始化结构的数组吗?
- 使用模板化结构作为构造函数参数
- 具有位域的结构的 Constexpr 构造函数
- 未调用的初始化静态thread_local结构的构造函数和析构函数
- 结构数组的构造函数错误,错误消息:没有构造函数实例与参数列表匹配
- 如何在继承层次结构中调用具有默认参数的构造函数?
- 使用构造函数初始化结构还是在之后设置其值更好?
- 嵌套的模板结构构造函数实现
- C++:如何在结构中定义类实例.类具有参数化的构造函数
- 结构中的默认成员值或默认构造函数参数
- c++ 17 中结构自动定义构造函数的规则是什么?
- 在结构的构造函数中使用类方法赋值变量