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 访问我的函数,告诉他这是一个带 * 的函数成员指针,然后传递我的参数。我在函数成员指针的同一类的函数中使用它,所以我不需要之前有一个对象,因为它是'this'对吗?

谢谢

4

1 回答 1

12

成员函数需要一个对象才能被调用。通过指向成员函数的指针调用时,您需要指定该对象,即使您从该类的另一个成员函数调用它也是如此。你想要的是:

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

这使用->*运算符来调用由g_ins[i].fcon表示的 CPU 的成员函数this

或者,如果函数不依赖于任何对象状态,您可以制作它们static并使用普通函数指针。fc现在将被定义为:

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

你会这样称呼它:

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