0

私は MVC アプリケーションを作成しています。私が探しているのは、ある種のシグナルまたはイベントをトリガーし、それをより高いレベルのビュー クラスに「バブル」させて処理する方法です。この「バブリング」と処理は、例外の場合のようにイベントが「スロー」されたときに実行が停止されないことを除いて、例外のスローとキャッチとまったく同じように動作します。

そのようなものはC++に存在しますか?

その背後にある私の理論的根拠は、これが機能するために、下位レベルのモデルクラスがビューについて何も知る必要がないということです。関数/オブジェクトポインターをどこでもビューに渡す必要はありません。

編集: 私のアプリケーションは標準の C++ を使用していることをおそらく追加する必要があるため、QT はまだありませんが、QT GUI にリンクしようとするかもしれません。モデル クラスに標準の C++ と共に QT 固有のコードを含めることは賢明でしょうか。

4

1 に答える 1

0

あなたが探しているのは、再起動可能な例外です。これらはC++では実装されていません。C ++では、例外ハンドラーの検索は検索時にアンワインドを実行するため、ハンドラーが見つかるまでに、そのハンドラーとスローサイト間のすべての情報が既に破棄され、スローサイトに戻ることができなくなります。

Common Lispには再起動可能な例外があります(これらは条件と呼ばれ、「スロー」されるのではなく「シグナル」されます)。条件が通知されると、ハンドラーの動的コンテキストを介して検索が実行されます。ハンドラーは、C ++や他の言語と同様に、型階層を使用して識別されます。ただし、その時点では巻き戻しは行われません。条件ハンドラー(単独で、または再起動ハンドラーと連携して)は、実行を続行する場所を決定します。これは、一方的な手順を踏むことなく、高レベルのコードからのガイダンスの下で、低レベルのコードを状況から回復できるため、非常に便利です。モデルビューコントローラーフレームワークでどのように役立つかがわかります。

C ++ 11にはローカルの無名関数があるので、おそらくこのようなものを一緒に組み合わせることができます。これらは真の字句クロージャではありませんが(「下向きのfunarg」のみ)、ハンドラーを渡すだけで下位レベルの関数から呼び出すことができ、返す必要がないため、必要なのはそれだけです。

于 2013-02-23T01:40:40.300 に答える