19

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 を繰り返す理由はありますか?

4

1 に答える 1

15

派生クラスをコピーしようとして出力される可能性のあるエラー メッセージは、コードではなく 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 を変更することを決定した場合に、わずかな余裕を残しました。

于 2014-03-19T03:10:42.463 に答える