【问题标题】:Repeating Q_DISABLE_COPY in QObject derived classes在 QObject 派生类中重复 Q_DISABLE_COPY
【发布时间】:2013-11-20 04:28: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 并通过这有效地防止我的派生类被复制?

【问题讨论】:

    标签: c++ qt qt5 qobject noncopyable


    【解决方案1】:

    尝试复制派生类时可能打印的错误消息可能是指 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 时给自己留下了很小的回旋余地。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-04
      • 1970-01-01
      • 2018-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-27
      • 2013-04-04
      相关资源
      最近更新 更多