1
void ChangeState(int newState)
{
    nextState = newState;

    //Change the state
    switch( nextState ) ///the change still will have a case for everything
    {
    case STATE_INTRO:
    {
        vec.pop_back();
        state ptr(new CIntroState);
        vec.push_back(ptr);
        break;
    }
    case STATE_MENU:
    {
        vec.pop_back();
        state ptr(new CMainMState);
        vec.push_back(ptr);
        break;
    }
    }
}

現在の状態を変更できるこの機能があります。しかし、私はそれについて考えました。これは、私が終了するまでに巨大なスイッチ ステートメントになるでしょう。現在、すでに約 10 の状態が含まれています。これは単なるサンプル コードです。少し違うことをしようとしていますが、どうすればいいのかわかりません。

void ChangeState(something)
{
    vec.pop_back();
    state ptr(new something);
    vec.push_back(ptr)
}

このようにすることができれば、switch ステートメントの使用を完全に回避して、同じ最終結果を得ることができます。誰もこれについてどうやって行くのか知っていますか? どんな助けでも大歓迎です。

4

2 に答える 2

1

テンプレートポリモーフィズムの組み合わせが必要なようです。テンプレートを使用すると、関数に渡すことができるさまざまな型をすべて列挙する必要はありません。これはコンパイル時に行われるためです。これらの異なる型をすべて同じベクトルに格納するには、それらすべてを何らかのスーパータイプのサブクラスにする必要があります。これにより、それらをスーパータイプのベクトルに並べて格納できます。

于 2013-03-11T23:38:29.837 に答える
1

ryanbwork が示唆するように、コンパイル時のポリモーフィズム (つまり、テンプレート) と実行時のポリモーフィズムをリンクする必要があります。ここでの課題は、現在の形式の反復コード (大きなswitch) を、同じように冗長ではあるがより宣言的な形式の反復コードに変換しないようにすることです。

別の一般的なスタック オーバーフローの質問が明らかにするように、クローン メソッドは通常、実行時に動的に決定される型の新しいインスタンスを作成する方法です。クローン作成は、実際にはより一般的なファクトリ パターンの特殊化であり、おそらく現在の列挙よりも少しだけ冗長な定義を持つ型の一連のファクトリを作成できます。

template <class T>
class factory {
public:
   T* operator()() {return new T;}
};

factory<CIntroState> IntroState;
factory<CMainState>  MainState;
// etc...

template <class Fac>
void ChangeState(Fac newStateFactory)
{
   vec.pop_back();
   vec.push_back(newStateFactory());
}
于 2013-03-11T23:56:57.837 に答える