如何通过指针

时间:2017-03-08 15:06:17

标签: state-machine

目前我尝试实施一个小型的State-Action-Matrix。 我有一个表格,其中包含有关我当前状态的信息,程序将从该状态转换到新的跟随状态。

在从一个状态转换到另一个状态的过程中,程序应该调用特定的成员函数。

Transitiontable的例子:

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


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

从这个表中调用的Memeber函数位于一个类中。

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

我的问题现在是,我如何调用Memeberfunction'foo'作为示例并将参数传递给它?

任何帮助都会被嘲笑,非常感谢。

1 个答案:

答案 0 :(得分:0)

实现Lookuptable的Typedefinitions,从一个当前状态指向一个follow-state。第一个typedef定义了一个Memberfunction-Pointer。然后,所述指针在结构中实现,以表示Lookuptable。

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

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

然后我将所述查找表作为我的类的私有属性进行了整合,因此指针可以访问私有成员函数。

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

Lookup-Table本身实现如下:

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

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

--- --- EDIT 对不起,我忘了提及如何使用这样的实现:

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

示例:

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