Ich habe gerade mit Qt angefangen und festgestellt, dass alle Beispielklassendefinitionen das Makro Q_OBJECT
Als erste Zeile haben. Was ist der Zweck dieses Präprozessor-Makros?
Aus der Qt-Dokumentation :
Der Meta-Object Compiler, moc, ist das Programm, das die C++ - Erweiterungen von Qt verarbeitet.
Das Tool moc liest eine C++ - Headerdatei. Wenn eine oder mehrere Klassendeklarationen gefunden werden, die das Makro Q_OBJECT enthalten, wird eine C++ - Quelldatei erstellt, die den Metaobjektcode für diese Klassen enthält. Unter anderem wird Meta-Objekt-Code für den Signal- und Slots-Mechanismus, die Laufzeit-Typinformationen und das dynamische Eigenschaftensystem benötigt.
Es teilt dem Pre-Compiler einfach mit, dass diese Klasse GUI-Elemente enthält und durch den 'moc' ausgeführt werden muss. Sie müssen dies nur Klassen hinzufügen, die den Signal/Slot-Mechanismus verwenden.
Aber es wird in allen anderen Klassen ignoriert - es verlängert nur die Erstellungszeit.
Der MOC (Meta Object Compiler) konvertiert die Header-Dateien des Makros Q_OBJECT in den entsprechenden C++ - Quellcode. Es steuert im Grunde den Signal-Slot-Mechanismus und macht ihn für den C++ - Compiler verständlich
1 Aus der Qt-Dokumentation von The Meta-Object System
Das Tool moc liest eine C++ - Quelldatei. Wenn eine oder mehrere Klassendeklarationen gefunden werden, die das Makro Q_OBJECT enthalten, wird eine weitere C++ - Quelldatei erstellt, die den Metaobjektcode für jede dieser Klassen enthält. Diese generierte Quelldatei wird entweder # in die Quelldatei der Klasse eingeschlossen oder in der Regel kompiliert und mit der Implementierung der Klasse verknüpft.
2 Aus der Qt-Dokumentation von THE Q_OBJECT
Das Q_OBJECT-Makro muss im privaten Abschnitt einer Klassendefinition enthalten sein, die ihre eigenen Signale und Slots deklariert oder andere vom Qt-Metaobjektsystem bereitgestellte Dienste verwendet.
3 Aus der Qt-Dokumentation von moc
Das Tool moc liest eine C++ - Headerdatei. Wenn eine oder mehrere Klassendeklarationen gefunden werden, die das Makro Q_OBJECT enthalten, wird eine C++ - Quelldatei erstellt, die den Metaobjektcode für diese Klassen enthält. Unter anderem wird Meta-Objekt-Code für den Signal- und Slots-Mechanismus, die Laufzeit-Typinformationen und das dynamische Eigenschaftensystem benötigt.
4 Aus der Qt-Dokumentation von Signale und Slots
Das Q_OBJECT-Makro wird vom Präprozessor erweitert, um mehrere Member-Funktionen zu deklarieren, die vom moc implementiert werden. Wenn Sie Compiler-Fehler im Sinne von "undefinierter Verweis auf vtable for LcdNumber" erhalten, haben Sie wahrscheinlich vergessen, den moc auszuführen oder die moc-Ausgabe in den Link-Befehl aufzunehmen.
Das Q_OBJECT-Makro muss im privaten Abschnitt einer Klassendefinition enthalten sein, die ihre eigenen Signale und Slots deklariert oder andere vom Qt-Metaobjektsystem bereitgestellte Dienste verwendet.