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