Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problema con herencia de clase QObject

Estas en el tema de Problema con herencia de clase QObject en el foro de C/C++ en Foros del Web. Hola a todos. Tengo el siguiente problema. Estoy creando una aplicacion en QT y a la hora de compilar me da un problema de ambiguedad, ...
  #1 (permalink)  
Antiguo 07/01/2016, 04:51
Avatar de Drewermerc  
Fecha de Ingreso: febrero-2014
Mensajes: 185
Antigüedad: 10 años, 9 meses
Puntos: 5
Problema con herencia de clase QObject

Hola a todos.
Tengo el siguiente problema.
Estoy creando una aplicacion en QT y a la hora de compilar me da un problema de ambiguedad, el error es el siguiente:
Código C++:
Ver original
  1. error: 'QObject' is an ambiguous base of 'MainWindow'
  2.      QObject::connect(c, SIGNAL(clicked()), this, SLOT( mostrar() ));                                                                                    ^
Mi problema se que esta en la gerarquia de clases pero no se como solucionarlo y ya investigue pero no logro ver mi problema, en resumen tengo la siguiente gerarquia.
Código C++:
Ver original
  1. class e : public QObject{       };
  2. class d : public QObject{       };
  3. class c : public QObject{        };
  4. class b: virtual public c, d, e {         };
  5. class a: public b{            };

tambien ya intente lo siguiente:
Código C++:
Ver original
  1. class e : virtual public QObject{       };
  2. class d : virtual public QObject{       };
  3. class c : virtual public QObject{        };
  4. class :  public c, d, e {         };
  5. class a: public b{            };

pero si lo intento así me da el siguiente error:
Código C++:
Ver original
  1. error: cannot convert from pointer to base class 'QObject' to pointer to derived class 'MainWindow' because the base is virtual
  2.          MainWindow *_t = static_cast<MainWindow *>(_o);
  3.                                                       ^

Espero me puedan ayudar.
Saludos.
Drewermerc.
  #2 (permalink)  
Antiguo 07/01/2016, 16:14
Avatar de xKuZz  
Fecha de Ingreso: febrero-2015
Ubicación: nullptr
Mensajes: 183
Antigüedad: 9 años, 8 meses
Puntos: 27
Respuesta: Problema con herencia de clase QObject

En primer lugar cuando tienes este tipo de jerarquía de clases en "forma de diamante", necesitas utilizar la palabra reservada virtual. Con esto sólo hay una única instancia de la base para todas las clases que heredan. Por tanto para el primer problema que tenías lo correcto es lo que habías hecho:

Código C++:
Ver original
  1. class e : public virtual QObject {};
  2. class d : public virtual QObject {};
  3. class c : public virtual QObject {};
  4. class b : public c,d,e {};
  5. class a : public b {};

El segundo problema viene de la clase MainWindow, que supongo por el error que será una de las que tienen herencia virtual de QObject. El hecho de que ahora todos compartan la misma instancia implica que no se puedan hacer el casting en tiempo de compilación sino en tiempo de ejecución por tanto debes usar dynamic_cast en vez de static_cast
  #3 (permalink)  
Antiguo 10/01/2016, 09:48
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Problema con herencia de clase QObject

Qt NO permite la doble herencia de QObject.

¿Por qué? Pues básicamente porque los objetos QObject tienen metadatos. Entre estos metadatos se encuentran las señales y ¿sabes qué? Las señales están mapeadas por identificadores numéricos y dichos identificadores empiezan SIEMPRE desde el 0.

Esto quiere decir que si coges dos QObject vas a tener varias señales solapadas y, como puedes imaginar, eso no puede ser bueno para la salud de tu programa.

Lo que te ha explicado xKuZz es la forma general de resolver una herencia en diamante, pero no va a solucionarte los problemas relacionados con las señales... y esto es así porque los metadatos no los genera el compilador de C++ sino el generador de mocs de Qt... que se ejecuta antes que el compilador y que no suele tener contemplaciones con este tipo de diseño.

Solución: Evitar la herencia múltiple de QObject.

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.

Etiquetas: clase, herencia, int
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:17.