3

私はこの 2 晩、これを理解しようと頭を悩ませてきましたが、肯定的な結果は得られませんでした。ブースト信号には、たとえば、あるクラスのメンバー関数を別のクラス信号に接続するたびに、後で切断したい場合は、結果の接続を変数に保存する必要があります。後で、同じメンバー関数を他のクラス シグナルに接続したい場合 (メンバー関数は以前のクラス シグナルにまだ接続されています)、この新しい接続も管理するために保存する必要があります。私の質問は、これを回避する方法はありますか?

4

2 に答える 2

8

Boost.Signalsチュートリアルで説明されているように、インスタンスを保持する必要はありませんconnection。元の呼び出し可能オブジェクトをに渡すことで、シグナルから切断できるはずです。メンバー関数の場合、問題はそれらを直接に渡すことができないという事実です。カスタム関数オブジェクトでラップしてから引数として使用できるようにするか、 Boost.Bindを使用します。これ自体はあまり役に立ちません。戻り型を簡単に宣言できないためです。ただし、この問題は、Boost.BindをBoost.Functionと一緒に使用することで解決できます。signal::disconnectsignalsignal::disconnect

私はあなたの質問に答えたと思います。

于 2011-09-21T08:21:00.777 に答える
7

範囲指定された接続

または、返された接続をsignal::scoped_connection型の変数に割り当てることもできます。これは、破棄または再割り当て時に自動的に切断されるタイプの接続です。これにより、シグナルスロット接続の有効期間が特定のスコープに効果的に制限されます。

たとえば、myConnection を再割り当てすると、以前の接続は自動的に切断されます。

scoped_connection myConnection = someObject.Signal.connect(MyHandler);
myConnection = totallyDifferentObject.Signal.connect(MyHandler);


自動接続管理

私たちのプロジェクトでは、通常、メンバー変数をスコープ接続として宣言します。したがって、それらのスコープは、属する特定のオブジェクト インスタンスのライブ タイムと一致します。これは、オブジェクト インスタンスが破棄されているときに、オブジェクト インスタンスが接続されているシグナルを自動的に切断する便利な方法です。スコープ接続がなければ、デストラクタで自分自身を手動で切断する必要があります。インスタンスが破棄されたときにインスタンスの切断を怠ると、プログラムをクラッシュさせる無効なシグナル ハンドラが呼び出されることになります。

于 2012-08-05T11:07:15.483 に答える