2012-08-04 7 views
36

Estoy usando Qt (que soy nuevo) 4.8.2, con Visual Studio, y he creado una clase base llamada "Contacto". No quiero que esta clase sea exclusiva de Qt, así que mi intención era crear otra clase "QContact" que heredara "Contacto", y QObject y tratar con todo el negocio relacionado con Qt, como la macro Q_OBJECT etc.Clases base sin Qt

Desafortunadamente cuando heredé, la compilación falló, diciendo:

moc_QContact.cpp(53): error C2039: 'staticMetaObject' : is not a member of 'Contact' 
moc_QContact.cpp(75): error C2039: 'qt_metacast' : is not a member of 'Contact' 
moc_QContact.cpp(80): error C2039: 'qt_metacall' : is not a member of 'Contact' 

Hice un poco de investigación en la web, y se informó que no se puede derivar una clase de la clase Qt no-Qt. entonces, para solucionarlo, "Contacto" podría heredar "QObject" (lo intenté, funcionó). pero hacerlo lo hará exclusivo de Qt, que es mi problema.

Así que lo que pregunto es esto: ¿Cómo se puede hacer una clase base no Qt para una clase Qt?

Gracias.

Respuesta

71

Puede derivar su clase de QObject y de otras clases que no derivan de ella, pero QObject needs to be the first base class en la lista de clases base.

Así que esto es falso:

class QContact: public Contact, public QObject {}; 

tiene que escribir como

class QContact: public QObject, public Contact {}; 
+0

Eso significa que la clase no tendrá uso fuera de los proyectos de Qt. ¿No hay manera de evitarlo? – MasterMastic

+0

@Ken no entiendo lo que eso significa. Si 'Contact' no tiene nada que hacer con' QObject', ¿por qué "no tendrá usos fuera de los proyectos de Qt"? ¿No era esta tu idea para archivar ese objetivo en primer lugar? –

+0

Lo siento, simplificaré: Quiero que "Contacto" NO herede de "QObject", porque si quiero usarlo para otros proyectos, tendré la clase base de QObject atrapada allí, y eso es problema con los proyectos que no son Qt. – MasterMastic

0

De An Introduction To Design Patters in C++ con Qt Capítulo 8.4:

para ayudar a asegurar que los procesos de moc cada QObject- clase derivada en el proyecto, a continuación se detallan algunas pautas para escribir: código C++ y archivos de proyecto qmake:

• Cada definición de clase debe ir en su propio archivo .h.

• Su implementación debe ir en un archivo correspondiente .cpp.

• El archivo de encabezado debe estar "ajustado" (por ejemplo, con #ifndef) para evitar la inclusión múltiple. • Cada archivo .cpp debe aparecer en la variable SOURCES del archivo de proyecto; de lo contrario no se compilará.

• Cada archivo de encabezado debe aparecer en la variable HEADERS del archivo .pro. Sin esto, moc no preprocesará el archivo.

• La macro Q_OBJECT debe aparecer dentro de la definición de clase de cada archivo de encabezado derivado de QObject para que moc sepa que debe generar el código para ello.