我有一個軟件狀態機,通過事件驅動的函數調用使用。即,我有一個狀態機柄一個struct包含表示當前狀態的函數指針:面向對象的C有限狀態機
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上都有一個開關/外殼,通常會產生一些動作,並更改curState函數指針以更改爲表示狀態的函數。所有這些代碼工作得很好,同時使用全局變量來確定何時完成某些狀態更改。 (這種類型的方法顯然不適用於函數實例化變量試圖知道何時停止)。但是,爲了減少全局變量和函數,我希望實現更多的面向對象的方法,以便在狀態機達到完整狀態時全局變量和指令內存消失。我知道有幾個例子說明如何在普通C中使代碼看起來像面向對象,但這裏的齒輪有一個扳手:外部模塊需要能夠發送事件給這個狀態機,而不需要指向狀態機的句柄。我怎樣才能做到這一點,而不需要將整個狀態機對象聲明爲全局的(這完全違背了一次我試圖釋放所有空間的原始意圖)?
如果這些措辭有些令人困惑,我很抱歉。我相信這是一個非常有用的話題,所以我會按照要求重新說明,但請在低估我之前發表評論......在任何人問起之前,現有的代碼庫都是C語言,並且暗示C++儘管做出了我的全部努力,但卻充耳不聞。
「外部模塊需要能夠將事件發送到這個狀態機,而無需一個指向狀態機處理。」 … 他們有什麼?如果模塊無法在不同的狀態機之間進行選擇,則只能有一個單例。 – Potatoswatter
限制似乎是任意的。爲什麼外部模塊不能通過'create_state_machine'函數獲得指針? –
@Patatoswatter:在這種情況下,你提出了一個很好的觀點,對於我的特殊用例,它只會是一個singleton,但我想要考慮如何回答singleton和non-singleton。將更新問題。 – SeaNick