派生的 QT 类的复制构造函数

copy constructor of derived QT class

本文关键字:构造函数 复制 QT 派生      更新时间:2023-10-16

>我有一个从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对象,应该复制 是否包括已添加到原始属性的属性?