复制派生QT类的构造函数

Kar*_*yan 8 c++ qt copy-constructor

我有一个公开继承的课程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;
};
Run Code Online (Sandbox Code Playgroud)

当我构建我的项目时,编译器抱怨:

警告::基类"类QWidget"应该在复制构造函数中显式初始化.

我从stackoverflow上的其他问题中检出了,得到了我的答案.但事实是,当我添加这样的初始化时:

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;
};
Run Code Online (Sandbox Code Playgroud)

我收到编译错误:

QWidget :: QWidget(const QWidget&)在此上下文中是私有的

所以,请解释一下我做错了什么.

BЈо*_*вић 18

QObject类描述页面告诉:

QObject既没有复制构造函数也没有赋值运算符.这是设计的.实际上,它们是声明的,但是在具有宏Q_DISABLE_COPY()的私有部分中.实际上,从QObject(直接或间接)派生​​的所有Qt类都使用此宏来声明其复制构造函数和赋值运算符是私有的.推理可以在Qt对象模型页面上关于Identity vs Value的讨论中找到.

这意味着您不应该复制QT对象,因为QObject在设计上是不可复制的.

第一个警告告诉您初始化基类(即QWidget).如果你想这样做,你将构建一个新的基础对象,我怀疑这是你想要做的.

第二个错误告诉你我上面写的内容:不要复制qt对象.


Com*_*sMS 12

通过从QObject派生,所有Qt类都是不可复制的.

在C++中通常的做法是禁止某些价值语义操作,例如复制多态对象.Qt给出了一些例子,说明如果在其文档中允许QObject复制时会出现的问题:

一个Qt对象......

  • 可能有一个唯一的QObject :: objectName().如果我们复制Qt对象,我们应该给出什么名称副本?
  • 在对象层次结构中有一个位置.如果我们复制Qt对象,副本应该放在哪里?
  • 可以连接到其他Qt对象以向它们发射信号或接收它们发出的信号.如果我们复制Qt对象,我们应该如何将这些连接转移到副本?
  • 可以在运行时添加未在C++类中声明的新属性.如果我们复制Qt对象,副本是否应包含添加到原始属性的属性?