ユーザーが文字列を入力し、ネットワーク経由で送信できるコマンドラインインターフェイスを備えたプログラムがあります。問題は、GUI の奥深くで生成されるイベントをネットワーク インターフェイスに接続する方法がわからないことです。たとえば、私の GUI クラス階層が次のようになっているとします。
GUI -> MainWindow -> CommandLineInterface -> EntryField
各 GUI オブジェクトは他のいくつかの GUI オブジェクトを保持し、すべてが非公開です。entryField オブジェクトは、メッセージが入力されたことを示すイベント/シグナルを生成します。現時点では、信号をクラス階層に渡しているため、CLI クラスは次のようになります。
public:
sig::csignal<void, string> msgEntered;
そしてc'torで:
entryField.msgEntered.connect(sigc::mem_fun(this, &CLI::passUp));
passUp 関数は、メイン ループで最終的にこれを実行できるようになるまで、所有するクラス (MainWindow) に接続するためのシグナルを再度発行します。
gui.msgEntered.connect(sigc::mem_fun(networkInterface, &NetworkInterface::sendMSG));
今、これは本当に悪い解決策のようです。GUI に何かを追加するたびに、クラス階層全体に接続する必要があります。これを回避する方法はいくつかあります。すべてのオブジェクトをパブリックにすることで、メイン ループでこれを実行できます。
gui.mainWindow.cli.entryField.msgEntered.connect(sigc::mem_fun(networkInterface, &NetworkInterface::sendMSG));
しかし、それはカプセル化の考え方に反します。GUI 全体でネットワーク インターフェイスへの参照を渡すこともできますが、GUI コードはできるだけ分離したいと考えています。
ここで本質的な何かが欠けているように感じます。これを行うためのきれいな方法はありますか?
注:私は GTK+/gtkmm/LibSigC++ を使用していますが、Qt でほぼ同じ問題が発生したため、そのようにタグ付けしていません。それは本当に一般的な質問です。