2017-03-08 8 views
0

현재 작은 State-Action-Matrix를 구현하려고합니다. 프로그램이 새로운 팔로우 상태로 전환되는 현재 상태에 대한 정보를 보유한 테이블이 있습니다.포인터로 멤버 함수를 호출하는 방법

한 상태에서 다른 상태로 전환하는 과정에서 프로그램은 특정 멤버 함수를 호출해야합니다. 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

Lookuptable을 구현하기위한 typedefitions은 하나의 현재 상태에서 후속 상태로 이동합니다. 첫 번째 typedef는 Memberfunction-Pointer를 정의합니다. 그런 다음 포인터는 Lookuptable을 상징하는 구조체로 구현됩니다. 포인터가 민간 memberfunctions에 액세스 할 수 있도록 그때 integretaed

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

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

내 클래스의 민간 특성으로 룩업 테이블 말했다.

:

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

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

--- 편집은 --- 미안 해요, 난 이러한 구현을 사용하는 방법을 언급하는 것을 잊었다 다음과 같이

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

조회 - 테이블 자체가 구현된다

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

예 :

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