派生クラスをコピーしようとして出力される可能性のあるエラー メッセージは、コードではなく 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' で宣言されたプライベート メンバーにアクセスできません
2 番目のエラー メッセージは、Qt を初めて使用する人にとって理解しやすいと思います。
Q_DISABLE_COPY がコードを読む人のためにクラス定義に含まれている場合、MyClass 定義も自己文書化されます。
派生クラスで定義を繰り返すもう 1 つの理由は、QObject の実装が Q_DISABLE_COPY() を使用しないように変更された場合に、将来のバグからコードを保護するためです。これはありそうもないことですが、この要件を文書化することで、Qt 開発者は、QObject を変更することを決定した場合に、わずかな余裕を残しました。