boot :: signalを見るための@ annoの勧告に従うと、予想通り、目的のCの解決策ほど単純ではありませんが、検討の結果、可能なオプションのように見えます。 boost::signal tutorialを見て、私は手元の問題の最も関連性の高い側面を調べると思った。通知の送信者を作成するには
:
は、クライアントが情報が到着すると、すべての接続されたクライアントにニュースを送るニュースプロバイダに接続する簡単なニュース配信サービスを、考えてみましょう。ニュース配信サービスは、次のように構築することができる。
class NewsItem { /* ... */ };
boost::signal<void (const NewsItem&)> deliverNews;
deliverNews
の目的NewsItem
が生成されたことをオブザーバーに通知することです。
オブザーバーは(ブースト::バインドライブラリを使用して)次のように追加することができます。
クライアントニュースの更新を受け取りたいだけdeliverNewsにニュースアイテムを受け取ることができる関数オブジェクトを接続する必要があります信号。例えば、我々はリストから割り当て解除されているオブザーバーを除去する問題に対処するためには、具体的にニュースを例えば,:
struct NewsMessageArea : public MessageArea
{
public:
// ...
void displayNews(const NewsItem& news) const
{
messageText = news.text();
update();
}
};
// ...
NewsMessageArea newsMessageArea = new NewsMessageArea(/* ... */);
// ...
deliverNews.connect(boost::bind(&NewsMessageArea::displayNews, newsMessageArea, _1));
を我々のアプリケーションで特別なメッセージ領域を有していてもよく、後押し::信号は
ただし、以下のソリューションを提供しています、どのようなユーザーはdeliverNewsが知っている newsMessageAreaオブジェクトを破壊し、ニュースメッセージ領域を閉じた場合は?おそらく、 セグメンテーションフォルトが発生します。しかし、Boost.Signalsの場合、 はNewsMessageAreaのみを追跡可能にし、newsMessageAreaが であれば、 newsMessageAreaのスロットは切断されます。追跡可能 オブジェクトの使用中に大きな制約がある
struct NewsMessageArea : public MessageArea, public boost::signals::trackable
{
// ...
};
このとき:NewsMessageAreaクラスは、ブースト::信号::追跡可能なクラス、例えばから公に を導出することにより、追跡可能な作られてスロット接続を作る: Boost.Bindを使って構築された関数オブジェクトは、boost :: bindに渡される 追跡可能オブジェクトへのポインタまたは参照が見つけられて追跡されるように理解されています。
Boost.signalsを試しましたか? – anno
私は一見を持っています、提案のおかげで。 – jbat100
少し異なるアプローチで、Qtは専用の前処理ツール(moc <->メタオブジェクトコンパイラ)を使って "シグナルとスロット"を実装しました。ただし、お客様のニーズに合ったものを使用することは妥当です。 –