私はこのようなヘッダーファイルにインターフェイスクラスを持っています。私は自分のアプリケーションの周り渡される私のインタフェースを実装するオブジェクトへのポインタを持っているこのインターフェイスからQObjectへのキャスト
class Implementation : public QWidget, public Interface
{
Q_OBJECT
Q_INTERFACES(Interface)
...
}
のように実装されることが期待される
class Interface
{
...
}
#define InterfaceIID "Interface"
Q_DECLARE_INTERFACE(Interface, InterfaceIID)
。今、私はすべてのInterfaceオブジェクトもQWidgetであることを知っています。なぜなら、これは唯一サポートされているユースケースなのでです。
QWidgetオブジェクトが必要なときに、私のインターフェイスオブジェクトをQWidgetにキャストするにはどうすればよいですか?
qobject_cast<QWidget*>(interface) //does not compile
dynamic_cast<QWidget*>(interface) //works but is it the right way?
dynamic_cast()は唯一の方法ですか? Qobject_cast()を使用してQWidgetからInterfaceにキャストできますが、逆は機能しません。
私はdynamic_cast()が共有ライブラリ全体で安全でないことを理解していますので、避けようとしています。
正しいアプローチは何ですか?
'Impllemntation'に' Interface'をキャストしてから 'Implementation'を' QWidget'にキャストしてください。私は 'Interface'が' QWidget'にキャストできるのは疑いがあります。なぜなら、それらは同じ継承チェーンの一部ではないようです。 – rozina
@rozina QWidgetはInterfaceの基本実装である可能性があります(コードから分かりません)ので、Interface *からQWidget *へのキャストが機能する可能性があります。 dynamic_castは答えを安全に与えます。 – Neil
@rozina残念ながら、私はそれをすることはできません。このキャストが発生した場合、コードは実装を認識しません。インタフェースを知っているだけで、実装がQWidgetから継承されていると仮定して文書化されています。 –