gpt4 book ai didi

c++ - 使用参数创建新对象

转载 作者:行者123 更新时间:2023-11-30 04:20:19 25 4
gpt4 key购买 nike

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

最佳答案

您需要将编译时多态性(即模板)和运行时多态性联系起来,正如 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());
}

关于c++ - 使用参数创建新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15350595/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com