c++ - 确保每个状态只有一个

标签 c++

我正在编写一个游戏引擎,现在我正在考虑如何确保游戏中的每个状态(无论是实体状态、游戏状态等)都只有一个实例。单例浮现在脑海中,但这似乎有点矫枉过正。我想到的另一件事是无名类:

class EntityState
{
  public:
    virtual void foo() = 0;
};

class : public EntityState
{
  public:
    void foo() {}
} walkLeftState;

// Because it inherits from EntityState, a named class, I can also
// pass it as a parameter:
void Entity::changeState(EntityState* state) {}

但问题是我想添加 Python 脚本,我不认为 Python 有无名类。还有哪些其他选择?

编辑:为什么我只需要每个状态中的一个。

我需要一个 away 来识别一个实体的状态。我可以用神奇的值(即 ID 字符串)来做到这一点,但这是一个非常丑陋的解决方案,imo。我更愿意通过比较指针来做到这一点,我确保它们始终是唯一的。但是我无法通过指针来识别,除非每个状态都有一个实例......

编辑 2: 一个解决方案...

最后我选择了函数对象。鉴于 State 类只包含一个函数而没有其他任何东西,现在我想起来了,首先拥有这个类并没有什么意义。最后,我想我会去做这样的事情:

typedef void (*EntityStateFunc)(Entity* entity, unsigned long currentTime);

namespace entitystate
{
    void walkLeft(Entity* entity, unsigned long currentTime);
    void stand(Entity* entity, unsigned long currentTime);
}

这几乎可以解决所有问题:没有单例,没有提示它可能会使测试更难,它很简单......唯一可能的缺点是如果一个状态需要超过一个函数;谁能想到状态需要比这更复杂的场景?

最佳答案

只需创建每个状态之一即可。

没有理由通过强制执行来使您的代码变得如此复杂。

你会写这样的函数吗:

int foo() {
   int x = 5;
   x++;

   return x;
}

然后开始吧,天哪,我只需要在这个函数中使用一个整型变量...我必须强制执行此操作?没有。

关于c++ - 确保每个状态只有一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6328619/

相关文章:

c++ - 结构内部的结构

c++ - OpenCL EXC_BAD_ACCESS(代码=1,地址=0xc00)

c++ - 卡在访问方法 C++

c++ - 元组的可变参数生成

c++ - 将 openMP 与 SETS 结合使用

c++ - 取消选择单选按钮

c++ - 如何使用 CodeBlocks 进行编译

c++ - 概念中的嵌套类型绑定(bind)在 GCC 和 clang 上失败,但在 msvc 上失败

c++ - 字符串流提取不起作用

c++ - 如何使用正则表达式匹配不包含特殊字符(&、\、<、>、|、)的字符串,除非它们以反斜杠开头