我有一个软件状态机,可以通过事件驱动的函数调用来使用。也就是说,我有一个结构的状态机句柄,它包含一个表示当前状态的函数指针:
typedef struct pHandle_t pHandle_t;
typedef void(*pState_f)(pHandle_t *pHandle, pEvent_t pEvent);
struct pHandle_t
{
pState_f curState;
void *contextPtr; // Is this needed?
};
然后每个状态由一个函数表示,该函数将句柄作为自身并将事件作为输入:
static void SM_Init(pHandle_t *pHandle, pEvent_t pEvent);
在每个函数中,pEvent上有一个开关/ case,通常会产生一些动作,并且更改curState函数指针以更改为表示状态的函数。所有这些代码都可以很好地工作,同时使用全局变量来确定何时完成某些状态更改。 (这种方法显然不适用于函数实例化变量以尝试知道何时停止)。
然而,为了减少全局变量和函数,我想实现一种更面向对象的方法,这样一旦状态机达到完全状态,我的全局变量和指令存储器就会消失。我知道有几个例子说明如何使代码在常规C中出现面向对象,但这里有一个扳手:外部模块需要能够向这个状态机发送事件而不需要指向状态机句柄的指针。如何在不要求将整个状态机对象声明为全局的情况下执行此操作(这实际上违背了在完成后尝试释放所有空间的原始意图)?
如果有些措辞令人困惑,我会提前道歉。我相信这是一个非常有用的话题,所以我会按照要求重新编写,但请在向我发表评论之前发表评论......在任何人要求之前,现有的代码库都是C,并且尽管我付出了很多努力,但仍然建议C ++充耳不闻。 / p>答案 0 :(得分:3)
这可能是一个可怕的想法,但同样地,它可能有助于说服你的同伴让你在你需要的地方存储一个小的,可怜的指针。
如果您必须识别状态机对象的实例是回调函数指针,那么要让多台机器运行,您需要复制所有函数,以便不同的指针在功能上可以相同,但是在转换为char *
时进行不同的比较。
因此,对于两台机器,您需要大约两倍的代码大小。三台机器:三合一。等
<颤动>