在派生自QObject的类中重复使用Q_DISABLE_COPY

20
在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个回答

16

尝试复制派生类时可能会打印出指向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':无法访问类中声明的私有成员

将MyClass更改为

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

结果是一组与MyClass有关的用户友好的错误,从以下内容开始:

error: C2248: 'MyClass::MyClass' : cannot access private member declared in class 'MyClass'

我认为第二个错误消息更容易理解,特别是对于新手接触Qt的人来说。

如果在类定义中包含Q_DISABLE_COPY,MyClass的定义也是自说明的,方便任何阅读代码的人。

重复在派生类中定义的另一个原因是为了保护您的代码免受将来的错误影响,如果QObject的实现更改为不再使用Q_DISABLE_COPY()。虽然这很少见,但通过记录此要求,Qt开发人员为自己留下了一些余地,以便以后决定更改QObject时可以进行调整。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接