Ich habe eine Klasse, die öffentlich von QWidget
geerbt wurde:
Wenn ich mein Projekt gebaut habe, beschwert sich der Compiler:
WARNUNG :: Die Basisklasse "class QWidget" sollte explizit initialisiert werden im Kopierkonstruktor.
Ich habe mich bei anderen Fragen zu stackoverflow ausgecheckt und meine Antwort bekommen. Aber Tatsache ist, als ich diese Initialisierung wie folgt hinzugefügt habe:
%Vor%Ich habe einen Kompilierfehler:
QWidget :: QWidget (const QWidget & amp;) ist privat in diesem Kontext
Also, bitte erklären Sie mir, was ich falsch mache.
Beschreibung der QObject-Klasse Seite sagt:
QObject hat weder einen Kopierkonstruktor noch einen Zuweisungsoperator. Das ist Absicht. Eigentlich sind sie deklariert, aber in einem privaten Bereich mit dem Makro Q_DISABLE_COPY (). Tatsächlich verwenden alle Qt-Klassen, die von QObject (direkt oder indirekt) abgeleitet sind, dieses Makro, um ihren Kopierkonstruktor und ihren Zuweisungsoperator als privat zu deklarieren. Die Argumentation finden Sie in der Diskussion zu Identität und Wert auf der Seite Qt-Objektmodell.
Das bedeutet, dass QT-Objekte nicht kopiert werden sollen, da QObject vom Design nicht kopierbar ist.
Die erste Warnung weist Sie an, die Basisklasse zu initialisieren (was QWidget ist). Wenn Sie dies tun wollen, werden Sie ein neues Basisobjekt konstruieren, und ich bezweifle, dass Sie das tun wollen.
Der zweite Fehler sagt Ihnen, was ich oben geschrieben habe: qt Objekte nicht kopieren.
Alle Qt-Klassen sind nicht kopierbar, indem sie von QObject abgeleitet werden.
In C ++ ist es üblich, bestimmte wert-semantische Operationen wie das Kopieren polymorpher Objekte zu verbieten. Qt gibt einige Beispiele für die Probleme, die auftreten würden, wenn copy für QObject in seinem Dokumentation :
Ein Qt-Objekt ...
- könnte ein eindeutiges QObject :: objectName () haben. Wenn wir ein Qt-Objekt kopieren, welchen Namen sollten wir der Kopie geben?
- hat eine Position in einer Objekthierarchie. Wenn wir ein Qt-Objekt kopieren, wo sollte die Kopie liegen?
- kann mit anderen Qt-Objekten verbunden werden, um Signale an sie zu senden oder Signale von ihnen zu empfangen. Wenn wir ein Qt-Objekt kopieren, wie sollen wir es tun Übertrage diese Verbindungen zur Kopie?
- kann zur Laufzeit neue Eigenschaften hinzufügen, die in der C ++ Klasse nicht deklariert sind. Wenn wir ein Qt-Objekt kopieren, sollte das kopieren die Eigenschaften hinzufügen, die dem Original hinzugefügt wurden?
Tags und Links c++ qt copy-constructor