我正在编码Gameboy模拟器,并且出于CPU的指示,我在此处(cpp.hpp中)使用此结构来存储有关它们的信息。该地图用于通过与其个人操作码相同的键来访问所有这些信息:
struct instruction {
std::string name; //name of the instruction
int cycles; //clock cycles required to be executed
int paramNum; //number of params accepted
void* function; //code to be executed
};
class Cpu {
private:
std::map<unsigned char, instruction> instrMap;
void Cpu::fillInstructions(void);
instruction addInstruction(std::string, int, int, void*);
public:
void add_A_n(unsigned char);
}
然后在cpu.cpp中,例如,我具有要转换为函数指针的函数之一,以便分配给struct指令的字段。所以我有这段代码:
void Cpu::add_A_n(unsigned char n) {
//body
}
void Cpu::addInstructions(std::string name, int cycles, int paramNum, void* function) {
instruction i = {name, cycles, paramNum, function};
return i;
}
void Cpu::fillInstructions() {
instrMap[0x80] = Cpu::addInstruction("ADD A, n", 4, 0, (void*)&Cpu::add_A_n);
}
目标是从内存中获取操作码,然后使用此操作码从映射中检索有关相对指令的信息,最后通过使用切换条件选择正确的指令来执行其功能:>
((void (*)(void))instrMap[0x80].function)(); //for 0 params
((void (*)(unsigned char))instrMap[0x90].function)((unsigned char)operand); //for 1 param
我的目标是将所有函数(甚至需要一些参数的函数)都转换为结构体中的一个。
它的相应功能已正确执行,但发出警告:
警告:从'void(Cpu :: )()'转换为'void '[-Wpmf-conversions] instrMap [0x80] = Cpu :: addInstruction(“ ADD A,n”,4,0,(void *)&Cpu :: add_A_n);
我该如何解决?为什么会发生?谢谢
答案 0 :(得分:2)
&Cpu::add_A_n
返回一个pointer to a member function,它与普通的函数指针有很大的不同,并且不能将两者混合使用。围绕成员函数指针的怪异之处是,非静态成员函数都需要一个this
实例才能调用该函数。
对于您来说,如果像add_A_n
这样的函数确实不依赖于this
,只需使其成为static
或非成员函数即可:
class Cpu {
...
static add_A_n(unsigned char);
};
这样,它不再需要调用this
,并且&Cpu::add_A_n
成为普通的函数指针。