【发布时间】:2011-01-02 18:30:15
【问题描述】:
我很确定这是一个模板问题,因为我似乎无法以任何其他方式解决它 - 但也欢迎非模板解决方案。
有限状态机有多个程序状态,每个状态可以对多个事件做出反应。
所以,我想为 Event、State 和 FSM 定义类。 FSM 有一个 State 集合(可能是向量,如果 STL 在嵌入式系统中出现问题,可能是链表),State 有一个 Events 集合。
每个状态和事件都有一个唯一的 Id 和一个用于调试海豚的名称字符串。
尴尬的是,我不希望 Id 是整数,而是枚举的元素。每个 FSM 的状态和事件都有不同的枚举。
如何最好地编写代码?你能举一个例子吗?有两个简单的 FSM,或者一个 FSm 有两个状态,每个状态有两个事件?
例如,如果我有
枚举 myEvents {a, b, c};
枚举 hisEvents {d, e, f, g};
我希望能够声明一个接受构造函数参数的事件类
(myEvents a,char *"event_a")and
(hisEvents g,char* "event_g")请注意,我不想只重载构造函数,因为这是限制性的——如果添加了新的事件枚举怎么办?
与状态类似,然后让我的 FSM 每个都有一个状态列表。
或者我只是一个人,坚持为 eventId 枚举,什么时候传递一个 int 会简单得多?
谢谢。
顺便说一句,我宁愿避免使用 Boost,因为它本身不确定它在嵌入式系统中的工作情况。我更喜欢内部开发,以便完全控制。
【问题讨论】:
-
你有固定数量的id?
-
仅供参考,Qt 有一个状态机框架,它适用于嵌入式平台。即使你不想使用 Qt,他们的 API 也可能会提供灵感/想法:doc.trolltech.com/solutions/4/qtstatemachine/…
-
我认为模板在这里对您没有多大帮助。我会为事件和状态使用抽象基类。 FSM 需要记住它的当前状态并接受导致转换到其他状态的事件。每个状态只是事件到状态 ID 的映射。使用枚举很好,但可维护性较差。你不能在不修改枚举的情况下添加新状态,尽管它确实让你保持 id 相同的值以帮助序列化到磁盘。