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