在 QObject 派生类中重复Q_DISABLE_COPY



在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?

尝试复制派生类时可能打印的错误消息可能引用 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: "我的类::我的类": 无法访问私有成员 在类"我的类"中声明

我认为对于刚接触Qt的人来说,第二条错误消息更容易理解。

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

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

相关内容

  • 没有找到相关文章

最新更新