Sil*_*cer 16 c++ qt noncopyable qobject qt5
在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并且通过这有效地防止了我的派生类被复制了吗?
mas*_*tis 13
尝试复制派生类时可能打印的错误消息可能引用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();
}
Run Code Online (Sandbox Code Playgroud)
导致此错误(以及一堆对QObject的引用).
错误:C2248:'QObject :: QObject':无法访问类'QObject'中声明的私有成员
将MyClass更改为
class MyClass : public QObject
{
private:
Q_DISABLE_COPY(MyClass)
public:
MyClass();
};
Run Code Online (Sandbox Code Playgroud)
导致更加用户友好的错误组,引用MyClass,从开始
错误:C2248:'MyClass :: MyClass':无法访问类'MyClass'中声明的私有成员
我认为第二个错误信息对于Qt的新手来说更容易理解.
如果Q_DISABLE_COPY包含在读取代码的任何人的类定义中,则MyClass定义也是自我记录的.
在派生类中重复定义的另一个原因是,如果将QObject的实现更改为不再使用Q_DISABLE_COPY(),则保护代码免受未来的错误.虽然这不太可能,但通过记录这个要求,Qt开发人员如果决定改变QObject,就会给自己留下少量的摆动空间.