2017-03-08 52 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 ... */ }