在QObject派生类中重复Q_DISABLE_COPY

时间:2013-11-08 08:15:18

标签: c++ qt qt5 qobject noncopyable

在Qt中有一个宏允许为类声明私有拷贝构造函数和赋值运算符:http://qt-project.org/doc/qt-5.0/qtcore/qobject.html#Q_DISABLE_COPY

据说这个宏应该用于所有QObject(尤其是QWidget)派生类。

我理解这是如何工作的以及为什么它有用。

我不明白:在QObject已经包含Q_DISABLE_COPY时,有没有理由在我的QObject派生类中重复Q_DISABLE_COPY,这样可以有效地防止我的派生类被复制?

1 个答案:

答案 0 :(得分:13)

尝试复制派生类时可能打印的错误消息可能引用QObject而不是代码,因此错误可能看起来令人困惑。例如,使用Visual Studio 2012编译此代码

class MyClass : public QObject
{

};

int main(int argc, char *argv[])
{
    Q_INIT_RESOURCE(application);

    MyClass obj1;
    MyClass obj2(obj1);

    QApplication app(argc, argv);
    app.setOrganizationName("QtProject");
    app.setApplicationName("Application Example");
    MainWindow mainWin;
    mainWin.show();
    return app.exec();
}

导致此错误(以及对QObject的一堆引用)。

  

错误:C2248:'QObject :: QObject':无法访问私有成员   在'QObject'类中声明

将MyClass更改为

class MyClass : public QObject
{
private:
    Q_DISABLE_COPY(MyClass)
public:
    MyClass();
};

开始,导致更加用户友好的错误组引用MyClass
  

错误:C2248:'MyClass :: MyClass':无法访问私有成员   在“MyClass”类中声明

我认为第二条错误信息对于Qt新手来说更容易理解。

如果Q_DISABLE_COPY包含在读取代码的任何人的类定义中,MyClass定义也是自我记录的。

在派生类中重复定义的另一个原因是,如果将QObject的实现更改为不再使用Q_DISABLE_COPY(),则保护代码免受未来的错误。虽然这不太可能,但是通过记录这个要求,Qt开发人员如果决定改变QObject,就会给自己留下一点小小的余地。