Pregunta

Tengo un problema con el QT con respecto a la energía múltiple debido a Qobject. Sé que muchos otros tienen los mismos problemas, pero no sé cómo debo solucionarlo.

class NavigatableItem : public QObject
{
    Q_OBJECT

    signals:
        void deselected();
        void selected();
        void activated();
};

class Button : public NavigatableItem, public QToolButton
{
    Q_OBJECT

    ...
}

class MainMenuOption : public Button
{
    Q_OBJECT

    ...
}

Cuando hago esto

MainMenuOption* messages = new MainMenuOption();
connect(messages, SIGNAL(selected()), SLOT(onMenuOptionSelected()))

Recibiré el error:

Qobject 'es una base ambigua de' Mainmenuoption '

La razón por la que dejé que NavigatableItem se aoje de Qobject debido a las señales. ¿Hay alguna forma de hacer esto?

Editar:

Agregar virtual a cada declaración de herencia, todavía me da el mismo error:

class NavigatableItem : public virtual QObject

class Button : public virtual NavigatableItem, public virtual QToolButton

class MainMenuOption : public virtual Button

Incluso después de un 'limpio todo', 'ejecutar qmake' y 'construir todo'.

¿Fue útil?

Solución

Requiere un poco más de código, pero lo que he hecho en el pasado es hacer uno de ellos (su NavigatableItem En este caso) una clase virtual pura, es decir, interfaz. En lugar de usar la macro de "señales", conviértelos en funciones protegidas virtuales puras. Luego, multiplique la herida de su clase derivada de Qobject, así como de la interfaz, e implemente los métodos.

Sé que es algo controvertido, pero evitar la herencia de implementación múltiple a toda costa resuelve una serie de problemas y confusión. los Pautas de estilo de Google C ++ Recomiende esto, y creo que es un buen consejo.

class NavigatableItemInterface
{
    // Don't forget the virtual destructor!
    protected:
        virtual void deselected() = 0;
        virtual void selected() = 0;
        virtual void activated() = 0;
};

class Button : public NavigatableItemInterface, public QToolButton
{
    Q_OBJECT
    ...
    signals:
        virtual void deselected();
        ...
}

Otros consejos

Use la herencia virtual, por ejemplo

class X : public virtual Y 
{
};

class Z : public virtual Y
{
};

class A : public virtual X, public virtual Z
{
};

solo tendrá una copia de la clase base Y

Debe usar la herencia virtual.

ver http://en.allexperts.com/q/c-1040/virtual-inheritance.htm

Parece que estás experimentando el problema de diamantes, ver también:

http://www.cprogramming.com/tutorial/virtual_inheritance.html

Hazlo asi:

class NavigatableItem : public virtual QObject
class Button : public virtual NavigatableItem, public virtual QToolButton
class MainMenuOption : public Button
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top