3

私はこの次の構造体を持っています

typedef struct      s_ins
{
  std::string       item;
  int               extended;
  void              (CPU::*fc)(std::list<std::string> &list>;
}                  t_ins;

次に、配列を宣言します。ここで、トークンを関数でリダイレクトする必要があります

t_ins     g_ins[] =                                                                                       
{                                                                                                         
  {"push", 1, &CPU::ins_push},                                                                            
  {"pop", 0, &CPU::ins_pop},                                                                              
  {"dump", 0, &CPU::ins_dump},                                                                            
  {"assert", 1, &CPU::ins_assert},                                                                        
  {"add", 0, &CPU::ins_add},                                                                              
  {"sub", 0, &CPU::ins_sub},                                                                              
  {"mul", 0, &CPU::ins_mul},                                                                              
  {"div", 0, &CPU::ins_div},                                                                              
  {"mod", 0, &CPU::ins_mod},                                                                              
  {"print", 0, &CPU::ins_print},                                                                          
  {"exit", 0, &CPU::ins_exit},                                                                           
  {"", 0, 0}                                                                                             
};

最後に、これは私がそれを(CPU関数メンバーで)呼び出す方法です:

(*g_ins[i].fc)(tokens);

私が得るものは:

cpu.cpp: In member function ‘void CPU::get_instruction(std::list<std::basic_string<char> >&)’:
cpu.cpp:40:16: error: invalid use of unary ‘*’ on pointer to member

私はそれを呼び出すために他の多くの方法を試しましたが、それでもいくつかのエラーがあります。これが私の考え方です。g_ins[i].fcを使用して関数にアクセスし、*を使用して関数メンバーポインターであることを伝え、パラメーターを渡します。関数メンバーポインタの同じクラスの関数で使用しているので、「これ」であるため、以前にオブジェクトを用意する必要はありません。

ありがとう

4

1 に答える 1

12

メンバー関数には、呼び出されるオブジェクトが必要です。メンバー関数へのポインターを介して呼び出す場合は、そのクラスの別のメンバー関数から呼び出す場合でも、そのオブジェクトを指定する必要があります。代わりに必要なのは次のとおりです。

(this->*g_ins[i].fc)(tokens);

これは、演算子を使用して、 onで->*示されるCPUのメンバー関数を呼び出します。g_ins[i].fcthis

または、関数がオブジェクトの状態に依存しない場合は、関数を作成してstatic通常の関数ポインターを使用できます。fcこれで、次のように定義されます。

void (*fc)(std::list<std::string> &list>);

そして、あなたはそれをそのように呼ぶでしょう:

g_ins[i].fc(tokens);
于 2013-02-20T18:31:49.057 に答える