c++ - ¿Por qué es importante incluir el archivo ".moc" al final de un archivo de código fuente Qt?
introspection (1)
Es necesario si define las subclases de
QObject
con la macro
Q_OBJECT
en un archivo
.cpp
.
Cuando lo hagas:
-
qmake
debe generar reglas dentro de suMakefile
para invocarmoc
en ese archivo.cpp
.Esa inclusión especial (¿hackish?) Activa
qmake
para hacerlo, y le dice cuál sería el archivo de salida deteststring.moc
(teststring.moc
) cuando se invoca en su.cpp
. -
Para compilar la salida de
moc
(que todavía es un montón de código C ++) el compilador debe ver su definición de clase. De lo contrario, se quejará de que no existeYourClass::staticMetaObject
y similares, porque no tiene idea de queYourClass
existe.Por lo general, uno define clases con
Q_OBJECT
en un archivo de encabezado.moc
luego agrega un#include "header.h"
en su salida generada, y esto significa que la salida de#include "header.h"
puede compilarse felizmente.Pero, ¿qué pasa si la definición de su clase está dentro de un
.cpp
? No puede.cpp
un archivo.cpp
en la salida de.cpp
, ya que eso le daría toneladas de errores de redefinición.En cambio,
.cpp
salida de.cpp
en su.cpp
, para que se compile y todos.cpp
contentos. (Esto significa queqmake
solo emitirá una regla que dice que ejecutemoc
, pero no otra regla que le indique al compilador que compile la salida democ
).
Desde 2. también puede suponer que definir clases con
Q_OBJECT
en un
.h
no requiere ninguna inclusión especial.
¿Por qué es importante agregar una inclusión para el archivo .moc en un código fuente Qt cpp?
Este es un paso común utilizado en varias muestras de Qt, incluido este: http://doc.qt.io/qt-5/qttestlib-tutorial1-example.html ; donde la línea #include "testqstring.moc" debe incluirse al final del archivo.
No entiendo exactamente por qué esto es necesario.
Gracias.