【问题标题】:C++ template for classes with static method具有静态方法的类的 C++ 模板
【发布时间】:2016-02-15 09:04:54
【问题描述】:

我目前正在使用 cocos2dx 引擎编写游戏,并且我有一个关卡管理器来跟踪当前关卡和需要加载的场景。我想避免长 if 语句,例如:

Scene* scene;
if (level == 1)
{
      scene = Game_Scene1::createScene();
}
else if (level == 2)
{
      scene = Game_Scene2::createScene();
}
else if (level == 3)
{
      scene = Game_Scene3::createScene();
}
(...)
else if (level == 10)
{
      scene = Game_Scene10::createScene();
}

Director::getInstance()->replaceScene(TransitionFade::create(0.5, scene, Color3B(0,0,0)));

screateScene() 方法是静态方法

static cocos2d::Scene* createScene();

我可以做些什么来“删除” if 语句?所以它看起来像这样:

Scene* scene = getScene(level, sceneClass::createScene());

它会采用正确的类(即:Game_Scene1Game_Scene2 等)

这样的问题有什么好的解决方案吗?标题是模板,但我不确定这个解决方案是否是模板。

【问题讨论】:

  • 如果level 是运行时值,则不能(仅)使用模板,因为它需要编译时值。但是你确定你的设计是对的吗?这些编号的类有点像警告标志。
  • 为什么方法是静态的?这看起来像动态多态性,即带有virtual createScene() 方法的基类GameScene。然后你创建一个工厂或者工厂方法来根据层数创建正确的实例。
  • 或者,它甚至看起来像Kit(基于原型的Factory)。为什么不同级别的场景有不同的类?这种东西应该是动态的,而不是静态的。
  • switch 怎么样?使用表格/地图怎么样?
  • @iksemyonov 如果我用 Java 编程,我会这样做,这是唯一的方法。我支持@joachim 的解决方案:一个用std::functions 填充的常量容器(map、array ...)。

标签: c++ templates c++11 refactoring cocos2d-x


【解决方案1】:

一个简单的解决方案是使用指针函数表。

你可以将你的表声明为

typedef cocos2d::Scene *(*PtfCreateScene)();
PtfCreateScene tab[10];

tab[0] = Game_Scene1::create_scene;
tab[1] = Game_Scene2::create_scene; ... 

使用此解决方案,您可以使用level 作为索引来调用关联的 create_scene 函数。从而避免 if 分支。

scene = tab[level - 1]();

您必须检查索引的正确性以避免内存不足。

希望我回答了你的问题。如果您需要更多解释,请随时询问。

【讨论】:

  • 谢谢!这对我帮助很大!我做的有点不同(所以它更适合我的代码)但你的解决方案仍然是成功的关键;)
  • 很高兴能帮上忙 ;)
猜你喜欢
  • 2013-05-11
  • 2019-09-06
  • 2011-10-20
  • 1970-01-01
  • 2012-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
相关资源
最近更新 更多