我有以下结构
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'对吗?
由于
答案 0 :(得分:9)
成员函数需要调用对象。通过指向成员函数的指针进行调用时,即使从该类的另一个成员函数调用该对象,也需要指定该对象。你想要的是:
(this->*g_ins[i].fc)(tokens);
这使用->*
运算符在g_ins[i].fc
上调用由this
表示的CPU的成员函数。
或者,如果函数不依赖于任何对象状态,则可以使它们static
并使用普通函数指针。 fc
现在定义为:
void (*fc)(std::list<std::string> &list>);
你会这样称呼它:
g_ins[i].fc(tokens);