Qt アプリケーションでプラグインで実装できる一連のインターフェイスがあります。すべてのプラグインでは、基本的な説明(説明、 の名前など)を提供するために、少なくとも1つの共通の インターフェイス(Base_plugin
)を実装する必要があります。特定のプラグインインターフェイスを呼び出すときは、しばしば にアクセスして、ユーザーインターフェイスに表示する必要があります。これは、次のようなコードの 多くにつながる:複数のインターフェイスを実装し、共通のインターフェイスにキャストするQtPlugins
Foo_plugin* p = getSuitableFooPlugin();
// cannot use qobject_cast, plug-in interfaces don't derive QObjects
Base_plugin* b = dynamic_cast<Foo_plugin*>(p);
setName(b->name());
p->getAction();
これはgccの上に少なくとも動作しますが、私は、これはWindows上 仕事に行くされていないことを恐れています。代わりに、reinterpret_cast
を使用するか、またはそれらをロードするときに正しいプラグインのポインタ を格納することができます( 有効なQObject*
があります)。これらの解決策のどちらも実際には私にきれいに見えません。
この問題を回避する方法がありますか?
'Foo_plugin'が' Base_plugin'から継承する場合、この方向に 'dynamic_cast'は必要ありません。実際、基本クラスは 'name()'メソッドを提供しているので、**すべてキャストする必要はありません**。なぜあなたは 'setName(p-> name());'? – ereOn
@ereOnこれは動作するためには仮想継承が必要です( 'Foo_plugin'、' Bar_plugin'などあり、プラグインは一度にすべてを実装できます)。 Qtは仮想ベースとのインタフェースをサポートしていますか? – pmr
Qtやgccに精通していませんが、gccとWindowsの間でこのコードが異なるのはなぜですか(VC++を意味すると思います)。 –