C++ C++;具有0或1参数的结构中的函数指针
这里我声明了一个结构,我的类中有一个数组C++ C++;具有0或1参数的结构中的函数指针,c++,function-pointers,C++,Function Pointers,这里我声明了一个结构,我的类中有一个数组 struct instruction { std::string disassembly; unsigned char operandLength; void* execute; }; ... class CPU { private: struct instruction opcodes[256]; void load_n_to_b(unsigned char arg1); //0x06 void l
struct instruction {
std::string disassembly;
unsigned char operandLength;
void* execute;
};
...
class CPU {
private:
struct instruction opcodes[256];
void load_n_to_b(unsigned char arg1); //0x06
void load_c_to_b(); //0x41
...
}
我已尝试初始化操作码数组,但不断出现“指令”的初始值设定项太多”或从类型“void(*)(unsigned char)”转换为类型“void*”无效的错误。由于函数可以有0个参数或1个参数,所以我不知道如何使它在C++中工作。
我正在初始化它们,如下所示
opcodes[0x06] = instruction{ "LD B, 0x%02X", 1, load_n_to_b };
opcodes[0x41] = instruction{ "LD B, C", 0, load_c_to_b };
您可以在
指令
结构中按住指向void
的指针。相反,您需要函数指针
void (*execute)() ;
它适用于
load_c_to_b
,因为它的参数也是void
。但是,我更喜欢void(*execute)(void*)
,因为如果我需要一个参数,我可以通过强制转换来使用它,否则,请忽略它。每当您看到void*
,考虑到你可能有什么不对。@ NeilButterworth,否则你将如何传递具有零点或一个变量的函数指针。函数指针不能保证转换为<代码>虚空*/COD>,反之亦然,所以这是毫无意义的。当你的问题是关于C++时,你可能应该使用函数对象。@ NeilButterworth,你如何做有不同函数签名的函数对象?如果你编写一个简单的CPU模拟器,那么不要使用函数指针。作为一个用FORTRAN77编写了一个相当完整的8080模拟器和开发环境的人来说,我不能转换为src/cpu/cpu.cpp:19:64:错误:从“void()(unsigned char)”到“void()(void*)”[-fpermissive]操作码[0x06]=(指令){“LD B,0x%02X”,1,load_n_to_B}的转换无效@显然你应该学习C/C++,这对两者来说都是一个共同的主题。@GeneralZero你必须将void load\u n\u改为\b(unsigned char arg1)代码>至<代码>无效荷载至(无效*arg1)代码>,并将无效加载_c_更改为_b()代码>至<代码>无效荷载(无效*)
在没有参数要传递的情况下,传递null:inst.execute(nullptr)代码>。在有参数要传递的情况下,按其地址传入并在函数中键入cast指针,例如:unsigned char value=。。。;指令执行(&value)。。。void load_n_to_b(void*arg1){unsigned char arg=*static_cast(arg1);…}
如果要传递多个参数,请通过指针传入结构。