<QtClassHelperMacros>

Macros d'aide aux classes. En savoir plus...

Header: #include <QtClassHelperMacros>

Macros

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)

Description détaillée

Documentation sur les macros

Q_DISABLE_COPY(Class)

Désactive l'utilisation des constructeurs de copie et des opérateurs d'affectation pour l'Class donnée.

Les instances des sous-classes de ` QObject ` ne doivent pas être considérées comme des valeurs pouvant être copiées ou assignées, mais comme des identités uniques. Cela signifie que lorsque vous créez votre propre sous-classe de ` QObject ` (directe ou indirecte), vous ne devez pas lui attribuer de constructeur de copie ni d’opérateur d’affectation. Cependant, il ne suffit peut-être pas de simplement les omettre de votre classe, car si vous écrivez par erreur du code nécessitant un constructeur de copie ou un opérateur d’affectation (ce qui est facile), votre compilateur se chargera de les créer pour vous. Vous devez aller plus loin.

L'utilisateur curieux aura remarqué que les classes Qt dérivées de ` QObject ` incluent généralement cette macro dans une section privée :

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

Elle déclare un constructeur de copie et un opérateur d’affectation dans la section privée, de sorte que si vous les utilisez par erreur, le compilateur signalera une erreur.

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

Mais même cela ne permet pas forcément de détecter absolument tous les cas. Vous pourriez être tenté de faire quelque chose comme ceci :

Tout d’abord, ne faites pas cela. La plupart des compilateurs généreront du code utilisant le constructeur de copie, ce qui déclenchera une erreur de violation de confidentialité, mais votre compilateur C++ n’est pas tenu de générer du code pour cette instruction d’une manière spécifique. Il pourrait générer du code n’ utilisant ni le constructeur de copie ni l’opérateur d’affectation que nous avons rendus privés. Dans ce cas, aucune erreur ne serait signalée, mais votre application planterait probablement lorsque vous appelleriez une fonction membre de ` w`.

Voir également Q_DISABLE_COPY_MOVE et Q_DISABLE_COPY_X.

Q_DISABLE_COPY_MOVE(Class)

Une macro pratique qui désactive l'utilisation des constructeurs de copie, des opérateurs d'affectation, des constructeurs de déplacement et des opérateurs d'affectation par déplacement pour l'Class on fournie.

Voir également Q_DISABLE_COPY et Q_DISABLE_COPY_MOVE_X.

[since 6.9] Q_DISABLE_COPY_MOVE_X(Class, reason)

À l'instar de Q_DISABLE_COPY_MOVE, cette macro désactive les opérations de copie et de déplacement pour la classe Class.

De plus, cela explique reason pourquoi cette classe ne prend pas en charge les opérations de copie et de déplacement. En C++26, cela amènera le compilateur à indiquer cette raison dans son message d'erreur pour tout code tentant d'effectuer ces opérations non prises en charge.

Cette macro a été introduite dans Qt 6.9.

Voir également Q_DISABLE_COPY_X et Q_DECL_EQ_DELETE_X.

[since 6.9] Q_DISABLE_COPY_X(Class, reason)

À l'instar de ` Q_DISABLE_COPY`, cette macro désactive les opérations de copie pour la classe ` Class`.

De plus, cela explique reason pourquoi cette classe ne prend pas en charge les opérations de copie. En C++26, cela amènera le compilateur à signaler cette raison dans son message d'erreur pour tout code tentant d'effectuer ces opérations non prises en charge.

Cette macro a été introduite dans Qt 6.9.

Voir également Q_DISABLE_COPY, Q_DISABLE_COPY_MOVE_X et 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.