2


0

C ++ FSMの設計と所有権

この構文のFSM /「プッシュダウンオートマトン」パーサーを実装したい:https://stackoverflow.com/questions/3025293/c-general-parser-with-scopes-and-conditionals [パーサーとスコープと条件付き]既にhttps://stackoverflow.com/questions/3085070/finite-state-machine-parser[Finite State Machineパーサー]に「lexed」されています

私は以下を持っています:

class State
{
public:
    virtual State* event( const string &token );
    State* deleteDaughter();
private:
    A* m_parent;
    A* m_daughter;
}
class SomeState : public State
{
public:
    State* event( const std::string &token );
}

B`の event() が(多くのif-elseifの後に) return m_parent→ deleteDaughter() を実行します。 これは怪しい(そしてクラッシュする)ことは知っていますが、娘の `State`から親の State`を返し、娘の `State`がリークしないようにする方法が必要です。

私のイベントループは次のようになります。

while( somestringstream >> token )
    state = state->event();

デザインと最後のコードをscる前に、http://www.objectvalue.com/articles/CppFiniteStateMachine.html [こちら]から非常に単純な例を拡張しようとしましたが、これはかなり問題ないようです。 明確さと簡潔さのために、私は決定の部分を州自体に移しています。

私はこの主題に関する本がたくさんあることを理解していますが、私はコンピューター科学者/プログラマーではないので、自分でこれを行うことを学びたいです(もちろん、SOのすべての友好的な人々の助けを借りて)。 コンセプトが明確でない場合は、お問い合わせください。 ありがとうございます。

1 Answer


0


これに関するあなたの意見を自由に投稿してください。しかし、私はすべてを優雅に処理する方法を見つけました:

最初:私のイベントループは、最後に作成された `State *`へのポインターを保持します。

2番目:各 State`には、コンストラクタで初期化された親 State`へのポインタがあり、デフォルトは0です(最初の `State *`以外に使用するとメモリリークが発生します)。これにより、どの州も範囲外にならないことが保証されます。

3番目:まさにこれを行う `State * endOfState()`関数(そして、これを特に誇りに思っています。

State* State::endOfState()
{
    State* parent = m_parent; // keep member pointer after suicide
    delete this;
    return parent;
}

これがサブクラスの「event()」内から呼び出されると、適切に自身を削除し、親ポインターを返します(ラダー内で1つ上に移動します)。

それでもリークが発生する場合は、お知らせください。 解決策が明確でない場合は、お問い合わせください:)

PS:すべての公平のために、インスピレーションはhttp://www.codeguru.com/forum/showthread.php?t=179284から盗まれました