2017-03-08 4 views
0

現在、私は小さなState-Action-Matrixを実装しようとしています。 私は、プログラムが新しいフォローステートに移行する現在の状態に関する情報を保持するテーブルを持っています。ポインタでメンバー関数を呼び出す方法

ある状態から別の状態への移行の進行中に、プログラムは特定のmemberfunctionを呼び出すことになっています。 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

ルックアップテーブルを実装するためのtypedefitionsは、現在の1つの状態からフォローステートに誘導します。最初の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; 

ポインタがプライベート-memberfunctionsにアクセスすることができて、私はその後、私のクラスのprivate属性と言ったルックアップテーブルをintegretaed。

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

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

--- EDITは--- 申し訳ありませんが、私はこのような実装を利用するためにどのように言及するのを忘れて、次のように

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

ルックアップテーブル自体は実装されています

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

例:

if((*this.*stateTransitions[i].transition)()) 
{ /* Do ... */ } 
関連する問題