使用参数创建新对象

时间:2013-03-11 23:30:11

标签: c++ parameter-passing new-operator

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语句并获得相同的最终结果。有谁知道如何去做?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

您似乎需要templatespolymorphism的组合。使用模板,您不需要枚举可以传递给函数的所有不同类型,因为这将在编译期间为您完成。要将所有这些不同的类型存储在同一个向量中,你需要让它们的所有子类都有一些超类型,然后允许你将它们并排存储在超类型的向量中。

答案 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());
}