派生的 QT 类的复制构造函数
copy constructor of derived QT class
>我有一个从QWidget
公开继承的类:
class MyWidget : public QWidget
{
Q_OBJECT
public:
MyWidget(const MyWidget& other)
:
obj1(other.obj1),
obj2(other.obj2)
private:
some_class obj1;
some_class obj2;
};
当我构建项目时,编译器抱怨:
警告:基类"类 QWidget"应显式初始化 在复制构造函数中。
我从堆栈溢出的其他问题中查看了出来,并得到了答案。但事实是,当我像这样添加初始化时:
class MyWidget : public QWidget
{
Q_OBJECT
public:
MyWidget(const MyWidget& other)
:
QWidget(other), //I added the missing initialization of Base class
obj1(other.obj1),
obj2(other.obj2)
private:
some_class obj1;
some_class obj2;
};
我收到编译错误:
QWidget::QWidget(const QWidget&) 在此上下文中是私有的
所以,请解释我做错了什么。
QObject 类描述页面告诉:
QObject既没有复制构造函数,也没有赋值运算符。这是设计使然。实际上,它们是声明的,但是在带有宏 Q_DISABLE_COPY() 的私有部分中。事实上,所有派生自 QObject(直接或间接)的 Qt 类都使用此宏来声明它们的复制构造函数和赋值运算符是私有的。推理可以在Qt对象模型页面上关于身份与价值的讨论中找到。
这意味着你不应该复制QT对象,因为QObject在设计上是不可复制的。
第一个警告告诉您初始化基类(即 QWidget)。如果你想这样做,你将构造一个新的基本对象,我怀疑这是你想要做的。
第二个错误是告诉你我上面写的:不要复制qt对象。
所有Qt类都是不可复制的,无法通过派生自QObject。
C++中,通常的做法是禁止某些值语义操作,例如在多态对象上进行复制。Qt给出了一些如果允许QObject在其文档中复制会出现的问题的例子:
一个 Qt 对象...
- 可能有一个唯一的 QObject::objectName()。如果我们复制一个Qt对象,我们应该给副本起什么名字?
- 在对象层次结构中具有位置。如果我们复制一个Qt对象,副本应该在哪里?
- 可以连接到其他Qt对象以向它们发出信号或接收它们发出的信号。如果我们复制一个Qt对象,我们应该如何 将这些连接转移到副本?
- 可以在运行时向其添加未在 C++ 类中声明的新属性。如果我们复制一个Qt对象,应该复制 是否包括已添加到原始属性的属性?
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 当从函数参数中的临时值调用复制构造函数时
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 使用复制构造函数复制双精度数组
- C 无可行的构造函数复制类型的变量
- 没有可行的构造函数复制类型 'MyString' 的数组元素
- 编译时,复制构造函数/复制分配和正常功能调用优化之间是否存在任何区别
- 如何最小化调用列表构造函数(复制构造函数)的次数?
- C 11矢量构造函数复制与范围
- 我定义了一个非复制构造函数;复制构造函数还会被隐式定义吗
- 可以将构造函数复制为转换运算符
- 将基类指针的构造函数复制到子类
- C++树类:构造函数/复制/内存泄漏
- 如何制作这个在模板构造函数复制中使用类型定义的类型的模板
- 将构造函数复制为模板化的成员函数
- 绕过私有复制构造函数/复制赋值C++
- C++通过构造函数复制对象
- 复制构造函数 - 复制C++中的对象
- 将带unique_ptr的类的构造函数复制到作为成员的抽象类