gpt4 book ai didi

c++ - C++中的状态机通过单例?

转载 作者:搜寻专家 更新时间:2023-10-31 00:21:11 24 4
gpt4 key购买 nike

我认为实现状态机的一个好方法是使用单例模式。例如,它看起来像这样:

class A
{

private:
friend class State;
State* _state;
void change_state(State* state) { _state = state; }
};

class State
{
virtual void action(A *a) = 0;
private:
void change_state(A *a, State *state) { a->change_state(state); }
};

class StateA : public State
{
public:
static State* get_instance()
{
static State *state = new StateA;
return state;
}
virtual void action(A *a) { change_state(a, StateB::get_instance(); }
};

class StateB : public State
{
public:
...
virtual void action(A *a) { change_state(a, StateA::get_instance(); }
};

我的问题是:我看过很多文章说单例模式太邪恶了。在没有单例模式的情况下实现这一点,您每次更改状态时都必须调用 new,因此对于那些不喜欢单例的人,您将如何实现状态机模式?

最佳答案

我认为单例模式在这里不合适。单例适用于表示实际上只有一个拷贝的抽象实体或物理对象。举个 Java 的例子,只有一个运行时环境,程序的特定实例在其中执行。单例非常适合表示这些对象,因为它们使整个程序能够命名和引用它,同时保留封装并允许多个可能的后端。

鉴于此,我不同意单例是您的状态机的最佳途径。如果您确实将其实现为单例,则表示它始终恰好是该状态机的一个拷贝。但是如果我想让两个状态机并行运行怎么办?或者根本就没有状态机?如果我想要我自己的本地状态机,这样我就可以在它上面做实验,看看它会发生什么?如果您的状态机是单例,我无法执行任何这些操作,因为整个程序实际上只使用一个状态机。

现在,根据您使用状态机的方式,它也许是合适的。如果状态机控制程序的整体执行,那么这可能是个好主意。例如,如果你正在开发一个视频游戏并且想要一个状态机来控制你是在菜单中,还是在聊天区,或者是在玩游戏,那么拥有一个单例状态机就完全没问题了,因为程序在任何时候都只有一种逻辑状态。不过,根据您的问题,我无法推断是否是这种情况。

至于如何在没有单例的情况下实现状态机,你可能想让状态机对象分配它自己的每个状态拷贝并建立转换表(如果你需要显式状态对象),或者只是有一个巨大的 switch 语句和一个控制你所处状态的枚举值。如果你有一个状态机实例,这不比当前版本低效率,如果你有多个实例,它允许你将本地信息存储在每个状态都不会污染可以被程序的其他部分读取的状态的全局拷贝。

关于c++ - C++中的状态机通过单例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4955740/

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