2017-03-08 53 views
0

當前我嘗試實現一個小的狀態動作矩陣。 我收到了一張表,其中包含有關當前狀態的信息,程序將從該狀態轉換到新的跟隨狀態。如何通過指針調用成員函數

在從一個狀態轉換到另一個狀態的過程中,該程序應該調用特定的成員函數。所述Transitiontable的

實施例:

typedef struct 
{ 
    int state; 
    int followState; 
    /* POINTER TO MEMBERFUNCTION */ 
}STATE_TRANSITION; 


STATE_TRANSITION stateTransition[] = 
{ 
    { state1, state2, /* ... */ }, 
    /* ... */ 
}; 

其是Memeberfunctions從該表中稱爲位於一個類。

class A 
{ 
public: 
    int foo(int); 
}; 

我現在的問題是,如何調用Memeberfunction'foo'的例子並將參數傳遞給它?

任何幫助都會很有幫助,非常感謝。

回答

0

Typedefinitions實現一個Lookuptable,從一個當前狀態指向一個跟隨狀態。第一個typedef定義了一個成員函數指針。所述指針然後在結構中實現以象徵Lookuptable。

typedef bool(MP_Commands::*Member)(); 

typedef struct 
{ 
    uint8_t currState;  // Current State 
    uint8_t followState; // Follow State 
    Member func;   // Transition Function 
}STATE_TRANSITION; 

然後我integretaed說查找表作爲我的類的私有屬性,因此指針可以訪問私人memberfunctions。

class A 
{ 
private: 
    STATE_TRANSITION stateTransitions[15]; 
    /*...*/ 
}; 

查找表本身實現如下:

static const STATE_TRANSITION _stateTransitions[] = 
{ 
    { state1, state2, &A::memberFun }, 
    /*...*/ 
}; 

memcpy(stateTransitions, _stateTransitions, 
    LENGTH(stateTransitions) * sizeof(stateTransitions[0])); 

---編輯--- 對不起,我忘了提及如何利用這種實現的:

(*this.*stateTransitions[i].transition)(); 

實施例:

if((*this.*stateTransitions[i].transition)()) 
{ /* Do ... */ }