<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 のサブクラスのインスタンスは、コピーや代入が可能な値としてではなく、一意の ID として考える必要があります。つまり、QObject のサブクラス(ディレクタまたは間接クラス)を作成する場合、そのサブクラスにコピー・コンストラクタや代入演算子を与えてはいけません。というのも、もし間違ってコピー・コンストラクタや代入演算子を必要とするコードを書いてしまった場合(それは簡単です)、コンパイラーはあなたのために考えて作ってくれるからです。それ以上のことをしなければならない。

好奇心旺盛なユーザーは、QObject から派生した Qt クラスが、通常このマクロを private セクションに含んでいることをご存知でしょう:

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_MOVEQ_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_COPYQ_DISABLE_COPY_MOVE_XQ_DECL_EQ_DELETE_Xも参照してください

© 2025 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.