Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;状态机设计:单态还是非单态_C++_Reference_Singleton_Smart Pointers_State Machine - Fatal编程技术网

C++ C++;状态机设计:单态还是非单态

C++ C++;状态机设计:单态还是非单态,c++,reference,singleton,smart-pointers,state-machine,C++,Reference,Singleton,Smart Pointers,State Machine,是的,我知道,单身模式的问题已经讨论过很多次了。我的稍有不同,请阅读 我在一台状态机上工作。任何实体都可以拥有一个处理相应实体状态的状态机: template <class T> class State { // Default interface for a state } class Entity; class SomeState : public State<Entity> { // Some implementation dedicated to

是的,我知道,单身模式的问题已经讨论过很多次了。我的稍有不同,请阅读

我在一台状态机上工作。任何实体都可以拥有一个处理相应实体状态的状态机:

template <class T>
class State {
    // Default interface for a state
}

class Entity;
class SomeState : public State<Entity> {
    // Some implementation dedicated to Entity's type.
    // Presumably a Singleton but maybe I'm wrong
}

template <class T>
class StateMachine {
public:
    StateMachine(T& entity, SOME_TYPE initial_state);
private:
    T& m_entity;
}

class Entity {
public:
    // An entity that holds a state machine
    Entity(): m_stateMachine(*this, SOME_WAY_TO_GET_"SOME_TYPE") {}
private:
    // Its state machine
    StateMachine<Entity> m_stateMachine;
}
模板
阶级国家{
//状态的默认接口
}
类实体;
类状态:公共状态{
//某些实现专用于实体的类型。
//可能是单身,但也许我错了
}
模板
类状态机{
公众:
状态机(T&entity,某些类型的初始状态);
私人:
T&m_实体;
}
类实体{
公众:
//持有状态机的实体
Entity():m_stateMachine(*这是某种获取某种类型的方法){
私人:
//它的状态机
状态机m_状态机;
}
所以我的问题是: 什么类型应该是“某种类型”

  • 我希望能够在容器中存储一些_类型(因此不可能进行简单的引用);也许是推荐信?对我来说,引用或引用包装器似乎是最好的解决方案,因为状态机需要有一个状态(如果它是指针,则不可能为null)
  • 智能指针也是如此:我尝试了,但没有成功,因为SomeState的构造函数应该是使用std::make_shared的公共构造函数(也许我应该在没有std::make_shared的情况下创建它?)
  • 我不想使用原始指针(我不希望代码中有任何“新的”)
  • 我希望我的StateMachine设计能够在很多实体和很多StateMachine+的情况下快速运行,一个状态对象不应该持有任何状态:这就是为什么我真的不想为每个实体实例化一个状态,而是使用一个单例,但也许我错了
  • 因为它是一个状态机(所以我不知道我处于哪个状态),所以我不能用静态方法代替and对象(单例或非单例)

你知道吗?我应该如何设计它?

很抱歉,我不完全理解您的意图。状态机不应该有一整套状态,而不仅仅是一个
实体
?在您的示例代码中,
SomeState
以某种方式使用了一个
实体
,该实体本身拥有一个
状态机
,您是否试图以这种方式对分层状态机进行建模?状态机拥有实体所处的当前状态,只有一个状态。一个状态机只与一个实体关联。(实体和状态机之间存在0-1关系,因为某些实体可能不使用状态机,即使我只给出了一个实体类的示例,其中每个实例都有一个不同的状态机)。创建状态机类的原则是,将代码分解为独立于不同类型实体的组件,这些实体可以使用状态来描述其行为。如果每个状态机只有一个状态,那么为什么它需要一个
初始状态
参数?初始状态只能是状态机的单一状态。在状态机及其实体的生命周期内,状态可能会更改。但在某一点上,只有一个国家持有。