<QtClassHelperMacros>
Hilfsmakros für Klassen. Mehr...
| Header: | #include <QtClassHelperMacros> |
Makros
| 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) |
Makro-Dokumentation
Q_DISABLE_COPY(Class)
Deaktiviert die Verwendung von Kopierkonstruktoren und Zuweisungsoperatoren für die angegebene ` Class`.
Instanzen von Unterklassen von ` QObject ` sollten nicht als Werte betrachtet werden, die kopiert oder zugewiesen werden können, sondern als eindeutige Identitäten. Das bedeutet, dass Sie, wenn Sie eine eigene Unterklasse von ` QObject ` (direkt oder indirekt) erstellen, dieser keinen Kopierkonstruktor und keinen Zuweisungsoperator zuweisen sollten. Es reicht jedoch möglicherweise nicht aus, diese einfach aus Ihrer Klasse wegzulassen, denn wenn Sie versehentlich Code schreiben, der einen Kopierkonstruktor oder einen Zuweisungsoperator erfordert (was leicht passieren kann), wird Ihr Compiler diese freundlicherweise für Sie erstellen. Sie müssen mehr tun.
Dem neugierigen Benutzer wird aufgefallen sein, dass die von ` QObject ` abgeleiteten Qt-Klassen typischerweise dieses Makro im privaten Bereich enthalten:
class MyClass : public QObject
{
private:
Q_DISABLE_COPY(MyClass)
};Es deklariert einen Kopierkonstruktor und einen Zuweisungsoperator im privaten Bereich, sodass der Compiler einen Fehler meldet, falls du sie versehentlich verwendest.
class MyClass : public QObject
{
private:
MyClass(const MyClass &) = delete;
MyClass &operator=(const MyClass &) = delete;
};Doch selbst das erfasst möglicherweise nicht absolut jeden Fall. Man könnte versucht sein, etwas wie Folgendes zu tun:
Zunächst einmal: Tun Sie das nicht. Die meisten Compiler generieren Code, der den Kopierkonstruktor verwendet, sodass der Fehler wegen Verletzung der Zugriffsbeschränkung gemeldet wird; Ihr C++-Compiler ist jedoch nicht verpflichtet, Code für diese Anweisung auf eine bestimmte Weise zu generieren. Er könnte Code generieren, der weder den Kopierkonstruktor noch den Zuweisungsoperator verwendet, die wir als privat deklariert haben. In diesem Fall würde kein Fehler gemeldet werden, aber Ihre Anwendung würde wahrscheinlich abstürzen, wenn Sie eine Mitgliedsfunktion von ` w` aufrufen.
Siehe auch Q_DISABLE_COPY_MOVE und Q_DISABLE_COPY_X.
Q_DISABLE_COPY_MOVE(Class)
Ein Komfortmakro, das die Verwendung von Kopierkonstruktoren, Zuweisungsoperatoren, Verschiebungskonstruktoren und Verschiebungszuweisungsoperatoren für die angegebene ` Class` deaktiviert.
Siehe auch „ Q_DISABLE_COPY “ und „ Q_DISABLE_COPY_MOVE_X “.
[since 6.9] Q_DISABLE_COPY_MOVE_X(Class, reason)
Ähnlich wie bei Q_DISABLE_COPY_MOVE deaktiviert dieses Makro Kopier- und Verschiebeoperationen für die Klasse Class.
Außerdem dokumentiert dies in der Datei „ reason “, warum diese Klasse keine Kopier- und Verschiebeoperationen unterstützt. In C++26 führt dies dazu, dass der Compiler diesen Grund in seiner Fehlermeldung angibt, wenn Code versucht, diese nicht unterstützten Operationen auszuführen.
Dieses Makro wurde in Qt 6.9 eingeführt.
Siehe auch Q_DISABLE_COPY_X und Q_DECL_EQ_DELETE_X.
[since 6.9] Q_DISABLE_COPY_X(Class, reason)
Ähnlich wie bei Q_DISABLE_COPY deaktiviert dieses Makro Kopiervorgänge für die Klasse Class.
Außerdem wird hier in der Dokumentation unter „ reason “ erläutert, warum diese Klasse keine Kopiervorgänge unterstützt. In C++26 führt dies dazu, dass der Compiler diesen Grund in seiner Fehlermeldung angibt, wenn Code versucht, diese nicht unterstützten Vorgänge auszuführen.
Dieses Makro wurde in Qt 6.9 eingeführt.
Siehe auch Q_DISABLE_COPY, Q_DISABLE_COPY_MOVE_X und 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.