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语句并获得相同的最终结果。有谁知道如何去做?任何帮助将不胜感激。
答案 0 :(得分:1)
您似乎需要templates和polymorphism的组合。使用模板,您不需要枚举可以传递给函数的所有不同类型,因为这将在编译期间为您完成。要将所有这些不同的类型存储在同一个向量中,你需要让它们的所有子类都有一些超类型,然后允许你将它们并排存储在超类型的向量中。
答案 1 :(得分:1)
你需要链接编译时多态(即模板)和运行时多态,正如ryanbwork建议的那样。这里的挑战是尽量避免将当前形式的重复代码(大switch
)转换为类似冗长但更具声明性的重复代码形式。
正如another流行的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());
}