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;
    }
    }
}

我有这个功能可以让我改变我的当前状态;然而,我想了想,当我完成时,这将是一个巨大的 switch 语句。目前,它已经有大约 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)转换为类似冗长但更具声明性的重复代码形式。

正如另一个流行的 Stack Overflow 问题所揭示的,克隆方法通常是在运行时创建动态确定类型的新实例的方式。克隆实际上是更一般的工厂模式的一种特殊化,您可以为您的类型创建一组工厂,其定义只会比您当前的枚举更详细一点:

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 回答