19

In Qt there is a macro that allows declaring private copy constructurs and assignment operators for classes: http://qt-project.org/doc/qt-5.0/qtcore/qobject.html#Q_DISABLE_COPY

It is said that this macro should be used for all QObject (especially QWidget) derived classes.

I understand how this works and why it is useful.

What I do not understand: Is there any reason to repeat Q_DISABLE_COPY in my QObject derived classes while QObject already contains Q_DISABLE_COPY and through this effectively prevents my derived classes from being copied?

4

1 回答 1

15

尝试复制派生类时可能打印的错误消息可能是指 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,他们会给自己留出少量的回旋余地。

于 2014-03-19T03:10:42.463 回答