尝试复制派生类时可能会打印出指向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时可以进行调整。