1

C++ で MVC アプリケーションを作成していますが、下位レベルのモデル クラスで GUI を単純なテキストで更新して、リーダーに出力を表示できるようにしたいと考えています。関数やオブジェクトのポインターを渡す必要はありません。面倒になり、あちこちに渡さなければならないからです。私が本質的に望んでいるのは、コンソール GUI の「cout」に相当するものです。これは、GUI について何も知らなくても、どこからでも GUI を更新するために呼び出すことができるある種のグローバル関数です。

タイトルでオブザーバー パターンについて言及しましたが、これはそのように聞こえるためです。GUI は、何らかの方法でこのグローバル オブジェクトまたは関数をサブスクライブし、呼び出されたときにリッスンすることができます。ただし、Observer を使用したソリューションを具体的に探しているわけではありません。

人々は私にシグナルとスロットについて言及しましたが、確かに、グローバルでない限り、オブジェクトがシグナルを放出できるようにするために「物事を渡す」必要があります。ここでも、グローバルな参照ポイントが役立ちます。

優れた設計原則が守られていることを確認しながら、これを行うにはどうすればよいですか?

4

2 に答える 2

0

実際、ここでは Observer パターンを使用するのが適切と思われます。ただし、ここでいくつかの間違いがあると思います。各参加者の役割を明確に定義する必要があります。次のパーティションをお勧めします。GUI はオブザーバー (つまり、リスナー) であり、下位レベルのオブジェクトはリスナーに変更を通知するものです。初期化時に、下位レベルのモジュールはそれ自体を GUI (オブザーバー) に登録します。変更が発生すると、下位モジュールがオブザーバーの public listen ハンドラーを実行し、必要なデータを入力として提供します。

これにより、目標を達成でき、スキームにグローバルが関与しなくなります。

于 2013-02-23T13:09:44.843 に答える
0

とを使用してこれを行うことができstdoutますstderr。それらからの出力をアプリケーションにリダイレクトするだけです。最も簡単な解決策は、アプリケーションの出力をファイルにリダイレクトし、使用tail -f redirected_output_file_nameして更新を確認することです。

または、それ以外の場合は を使用できますlog4cxx。この場合、カスタム アペンダーを実装する必要があります。

于 2013-02-23T13:01:33.520 に答える