gpt4 book ai didi

c++ - 如何将函数分配给函数指针?

转载 作者:搜寻专家 更新时间:2023-10-31 02:03:33 24 4
gpt4 key购买 nike

我正在编写一个 Gameboy 模拟器,对于 CPU 的指令,我在此处(在 cpp.hpp 中)使用此结构来存储有关它们的信息。该 map 用于通过等于其个人操作码的 key 访问所有这些信息:

    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 中,我有一个函数,例如,我想转换为函数指针,以便分配给结构指令的字段。所以我有这段代码:

    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);
}

目标是从内存中获取操作码,然后使用此操作码从映射中检索有关相关指令的信息,最后通过使用 switch case 选择正确的指令来执行其功能:

    ((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);

我该如何解决它,为什么会发生?谢谢

最佳答案

&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就变成了一个普通的函数指针。

关于c++ - 如何将函数分配给函数指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55307052/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com