一部の C++ クラス間の結合を減らすために、コールバックを利用してきました。用語を定義するには: コールバックを作成するクラスを呼び出し元と呼び、コールバックを受け取るクラスを呼び出し先と呼びます。通常 (必ずしもそうとは限りません)、呼び出し先は呼び出し元を所有します。設計上、呼び出し元は呼び出し先を認識しません。
呼び出し元オブジェクトの寿命に関連する問題が発生しています。任意のコールバックを行った後も生きているという保証はありません。次の基本的な例を見てください。
void caller::f()
{
/* Some work */
if (...)
{
/* [1] Execute callback */
_callee->callback(this);
}
/* [2] Some more work */
}
呼び出し先が呼び出し元を動的に割り当て、特定の条件が発生するのを待つためにコールバックに登録したとします。その場合、呼び出し先は [1] のコールバック内から呼び出し元を削除します。その場合、制御は caller::f に戻りthis
ますが、削除されており、[2] のコードはクラッシュする可能性が高くなります。
一般的なケースでは、呼び出し元は呼び出し先について何も想定できません。this
呼び出し先が を所有しているかどうか、または割り当てを解除する可能性があるかどうかがわからないthis
ため、呼び出し元のメンバー関数のスコープの割り当て解除を防止する一般的な手段が必要になります。
私はそれを使用したことはありませんが、考えられる解決策はboost::shared_ptrs
とを中心に展開していると思います。enable_shared_from_this
これらのコールバックは、処理能力が限られているモバイル デバイスで非常に頻繁に (毎秒 40 回以上) 実行されるため、多くの を作成して渡すオーバーヘッドについても心配していshared_ptrs
ます。
委任は、Objective-C ではかなり一般的なパターンです。私は、一般的な C++ の設計パターンにはあまり詳しくありません。この問題をすばやく簡単に修正する方法はありますか? そうでない場合、この設計は通常、C++ でどのように行われますか?