7

QObjectが原因で、複数の継承に関してQTに問題があります。他の多くの人が同じ問題を抱えていることは知っていますが、どうすれば修正できるかわかりません。

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

    ...
}

私がこれをするとき

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

エラーが発生します:

QObject'は'MainMenuOption'のあいまいなベースです

シグナルのためにNavigatableItemをQObjectから継承させた理由。これを行う方法はありますか?

編集:

各継承宣言に仮想を追加しても、同じエラーが発生します。

class NavigatableItem : public virtual QObject

class Button : public virtual NavigatableItem, public virtual QToolButton

class MainMenuOption : public virtual Button

「すべてをクリーンアップ」した後でも、「qmakeを実行」および「すべてをビルド」します。

4

3 に答える 3

8

もう少しコードが必要ですが、私が過去に行ったことは、そのうちの1つ(NavigatableItemこの場合はあなた)を純粋な仮想クラス、つまりインターフェイスにすることです。「シグナル」マクロを使用する代わりに、それらを純粋な仮想保護機能にします。次に、QObjectから派生したクラスとインターフェイスからmultiply-inheritを実行し、メソッドを実装します。

多少議論の余地があることは承知していますが、複数の実装の継承を絶対に回避することで、多くの問題と混乱を解決できます。Google C ++スタイルガイドラインはこれを推奨しており、それは良いアドバイスだと思います。

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();
        ...
}
于 2011-03-23T12:48:08.010 に答える
0

仮想継承を使用する必要があります。

http://en.allexperts.com/q/C-1040/virtual-inheritance.htmを参照してください

ダイヤモンドの問題が発生しているようです。以下も参照してください。

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

このようにしてください:

class NavigatableItem : public virtual QObject
class Button : public virtual NavigatableItem, public virtual QToolButton
class MainMenuOption : public Button
于 2011-03-23T14:07:22.267 に答える
0

仮想継承を使用します。例:

class X : public virtual Y 
{
};

class Z : public virtual Y
{
};

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

基本クラスYのコピーは1つだけになります

于 2011-03-23T10:39:35.803 に答える