24

Java から書き直されたかなり複雑な C++ クラスのセットがあります。したがって、各クラスには単一の継承クラスがあり、1 つ以上の抽象クラス (またはインターフェイス) も実装します。

qobject_cast()クラスからインターフェイスの 1 つに変換するために使用することは可能ですか? からすべてのインターフェイスを派生させるQObjectと、あいまいなQObject参照が原因でエラーが発生します。ただし、 から継承した基本クラスしかない場合は、 sで動作するためQObject使用できません。qobject_cast()QObject

インターフェースによって参照されるプラグインと DLL の間でクラスを配置できるようにしたいと考えています。

4

1 に答える 1

32

いくつかの調査とqobject_castのドキュメントを読んだ後、私はこれを見つけました:

qobject_cast() はインターフェースと組み合わせて使用​​することもできます。詳細については、プラグ アンド ペイントの例を参照してください。

例へのリンクは次のとおりです: Plug & Paint

例のインターフェイス ヘッダーを調べたところ、やりたいことを実行できるQ_DECLARE_INTERFACEマクロが見つかりました。

まず、インターフェイスから継承しないでください。QObject使用しているすべてのインターフェイスに対して、次のように Q_DECLARE_INTERFACE 宣言を使用します。

class YourInterface
{
public:
    virtual void someAbstractMethod() = 0;
};

Q_DECLARE_INTERFACE(YourInterface, "Timothy.YourInterface/1.0")

次に、クラス定義で、次のようにQ_INTERFACESマクロを使用します。

class YourClass: public QObject, public YourInterface, public OtherInterface
{
    Q_OBJECT
    Q_INTERFACES(YourInterface OtherInterface)

public:
    YourClass();

    //...
};

このすべての問題の後、次のコードが機能します。

YourClass *c = new YourClass();
YourInterface *i = qobject_cast<YourInterface*>(c);
if (i != NULL)
{
    // Yes, c inherits YourInterface
}
于 2010-09-16T12:57:01.110 に答える