私は Qt アプリケーションのバックエンド モデルを作成しており、移植性のために (Qt を破棄することにした場合)、Qt の代わりにモデルの背後にあるライブラリとして boost を使用しています。
Qt には、プラグインとメイン アプリケーション間の通信にインターフェイスを使用する必要がある素晴らしいプラグイン システムがあります。このため (また、モデルの一部をシームレスに変更できるようにするため)、すべての純粋仮想関数を実装するインターフェイス クラスの観点からモデルを定義しました。Qt マクロ (QT_DECLARE_INTERFACE) を使用してそれらをインターフェイスとして宣言していませんが、将来のプラグインの顔となる Qt に宣言された「ラッパー」インターフェイス内でそれらを使用しても問題はありません。
私の質問への続き:1)仮想デストラクタを除くすべての純粋な仮想メンバーがあり、2)メンバー変数がない場合、クラスはC ++のインターフェースと見なされることをどこかで読みました。コンパイラは「インターフェイス」クラスであるかどうかを気にしないため、これは純粋に慣例のように思えます。Qt プラグインとインターフェースで試行錯誤した結果、プラグインへのインターフェースは、それによって参照されるすべてのものに共通のコード ベースがあることを確認するだけでよいように思えました (つまり、共有ライブラリによってサポートされているもの以外のクラスを使用しない限り、 class もインターフェイスです)、未解決の関数がないようにします。これをうまく説明できているかどうかわからないので、さらに明確にする必要がある場合は、それを与えることができます。
私の質問はこれですブースト信号は、共有ライブラリに支えられたテンプレート化されたメンバー変数に見えるだけなので (プラグインもブーストを参照します)、Qt へのインターフェイスで使用される予定のクラスでブースト信号を使用できますか?対応プラグイン?
コード例
このクラスは、Qt プラグイン インターフェイスによって参照されても問題ないことはわかっています。
class IBlock
{
public:
virtual ~IBlock() {}
virtual int getId() = 0;
virtual std::string getGroup() = 0;
virtual std::string getName() = 0;
//etc...
};
でもこれでもいいの?
#include "iblockinput.h" //just another interface I made. relationship is: block has many inputs
#include <boost/smart_ptr.hpp>
#include <boost/signals2.hpp> //signals2 is both thread safe and doesn't make the Qt moc angry
class IBlock
{
public:
virtual ~IBlock() {}
virtual int getId() = 0;
virtual std::string getGroup() = 0;
virtual std::string getName() = 0;
//etc...
boost::signals2::signal<void (boost::weak_ptr<IBlockInput>)> sigInputAdded; //there are 4 of these
};
Qt は Qt シグナルをインターフェイスに配置することを許可していませんが (moc は最終的に未解決になるコードを入力します)、文字列名でそれらを参照できるため、問題がなければ非常に便利です。私の知る限り、Boost ではこの文字列全体を参照することは許可されていないため、シグナルを通常の変数として参照できると、インターフェイス オブジェクトにスロットをアタッチするときに本当にきれいになります。