复制派生QT类的构造函数

时间:2013-09-30 10:58:34

标签: 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;
};

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

  

WARNING ::应该显式初始化基类“class 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;
};

我收到了编译错误:

  

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

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

2 个答案:

答案 0 :(得分:17)

QObject Class说明页面告诉:

  

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

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

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

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

答案 1 :(得分:11)

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

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

  

Qt对象......

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