4

私は基本的にこの問題を抱えています。現在、入力として文字列を取得するシステムがあり、基本的に ACTION: と表示されます。

アクションごとに、次のような自動生成関数 (Rational Rose GRRR) があります。

bouncer_comm.chatMessage("data goes here").sendAt(msg->sapIndex0());
bouncer_comm.askforname().sendAt(msg->sapindex0());

bouncer_commを返しますRTOutSignal。ローズが使用する奇妙な構造のため、手動で作成することはできません。

今のところ、私の唯一のオプションは、100 ほどの if ステートメントを作成することです。

if(action == "CHAT")  bouncer_comm.chatMessage("data goes here").sendAt(msg->sapIndex0());

これは本当に迷惑です。

これを回避する最善の方法は何でしょうか? 私は無数のことを見たり試したりしましたが、これは本当に古いバージョンの合理的なバラ (2k より前) です。

誰かが素晴らしいアイデアを持っているなら。

4

5 に答える 5

12

上記の関数ポインタ ハッシュに関する @cobbal のアイデアは気に入っていますが、この条件付きロジックをポリモーフィズムに置き換えることもできます。

参照: http://c2.com/cgi/wiki?ReplaceConditionalWithPolymorphism

于 2009-03-21T21:35:01.963 に答える
6

関数ポインターを格納するハッシュは、ここでうまく機能する可能性があります

于 2009-03-21T21:27:42.433 に答える
2

ポリモーフィズムをファクトリ パターンと組み合わせて使用​​しました。私はこれに多くのifを減らしました:


MyAbstractClass *ac = Factory::getHandlerFor(data);
ac->perform(parameters);
于 2009-03-21T21:40:57.503 に答える
1

最も簡単なのはboost::関数のマップだと思います。

于 2009-03-21T21:46:43.900 に答える
0

boost::bind または boost::function とマップを使用できます。これにより、各関数が異なる量のパラメーターを持っていることを知っていても、正しい関数を呼び出すことができます。

余分なコードが必要ない場合は、関数オブジェクトと継承を使用できます。

于 2009-03-21T21:39:30.377 に答える