<QtClassHelperMacros>

クラスヘルパーマクロ。詳細...

Header: #include <QtClassHelperMacros>

マクロ

Q_DISABLE_COPY(Class)
Q_DISABLE_COPY_MOVE(Class)
(since 6.9) Q_DISABLE_COPY_MOVE_X(Class, reason)
(since 6.9) Q_DISABLE_COPY_X(Class, reason)

詳細な説明

マクロのドキュメント

Q_DISABLE_COPY(Class)

指定されたClass に対して、コピーコンストラクタおよび代入演算子の使用を無効にします。

QObject のサブクラスのインスタンスは、コピーや代入が可能な値としてではなく、一意の識別子として捉えるべきです。つまり、QObject の独自のサブクラス(ディレクタ型または間接型)を作成する際は、そのクラスにコピーコンストラクタや代入演算子を実装してはなりません。 しかし、単にクラスからそれらを省略するだけでは不十分な場合があります。なぜなら、誤ってコピーコンストラクタや代入演算子を必要とするコードを書いてしまった場合(これはよくあることです)、コンパイラが親切にもそれらを自動的に生成してしまうからです。それ以上の対策が必要です。

好奇心旺盛なユーザーならお気づきかもしれませんが、QObject から派生した Qt クラスには、通常、プライベートセクションに次のマクロが含まれています。

class MyClass : public QObject
{
private:
    Q_DISABLE_COPY(MyClass)
};

これはプライベートセクションでコピーコンストラクタと代入演算子を宣言するもので、誤ってこれらを使用した場合にコンパイラがエラーを報告するようにします。

class MyClass : public QObject
{
private:
    MyClass(const MyClass &) = delete;
    MyClass &operator=(const MyClass &) = delete;
};

しかし、これでも絶対にすべてのケースを捕捉できるとは限りません。次のようなことをしたくなるかもしれません:

まず第一に、そうしてはいけません。ほとんどのコンパイラはコピーコンストラクタを使用するコードを生成するため、プライバシー違反のエラーが報告されますが、お使いのC++コンパイラがこの文に対して特定の方法でコードを生成する義務はありません。コピーコンストラクタも、プライベートにした代入演算子も 使用しないコードを生成する可能性もあります。 その場合、エラーは報告されませんが、w のメンバ関数を呼び出した際に、アプリケーションはおそらくクラッシュするでしょう。

「 Q_DISABLE_COPY_MOVE 」および「Q_DISABLE_COPY_X 」も参照してください 。

Q_DISABLE_COPY_MOVE(Class)

指定されたClass に対して、コピーコンストラクタ、代入演算子、移動コンストラクタ、および移動代入演算子の使用を無効にする便利なマクロです。

Q_DISABLE_COPY およびQ_DISABLE_COPY_MOVE_Xも参照してください 。

[since 6.9] Q_DISABLE_COPY_MOVE_X(Class, reason)

Q_DISABLE_COPY_MOVE と同様に、このマクロはクラス `Class` に対するコピーおよび移動演算を無効にします。

さらに、このマクロは、reason において、このクラスがコピー/移動操作をサポートしていない理由を文書化しています。C++26 では、これにより、これらのサポートされていない操作を試みるコードに対して、コンパイラがその理由をエラーメッセージとして報告するようになります。

このマクロは Qt 6.9 で導入されました。

Q_DISABLE_COPY_X およびQ_DECL_EQ_DELETE_Xも参照してください 。

[since 6.9] Q_DISABLE_COPY_X(Class, reason)

Q_DISABLE_COPY と同様に、このマクロはクラス `Class` に対するコピー操作を無効にします。

さらに、このマクロは、reason において、このクラスがコピー操作をサポートしない理由を文書化しています。C++26 では、これにより、サポートされていない操作を試みるコードに対して、コンパイラがその理由をエラーメッセージとして報告するようになります。

このマクロは Qt 6.9 で導入されました。

Q_DISABLE_COPY 、Q_DISABLE_COPY_MOVE_X 、およびQ_DECL_EQ_DELETE_Xも参照してください 。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.