C++ 调用成员函数指针时,指向与对象不兼容的成员类型的指针
问题 我有一个在运行时分配的成员函数指针数组。我在尝试调用它们时遇到编译时错误: 指向成员类型“void(YCPU:)(uint16_t){aka”void(YCPU:)(短无符号int)}的指针与对象类型“YCPU指令”不兼容` 我很难理解调用指针的正确语法 代码和问题详细信息 我有一个存储两个成员函数指针的structC++ 调用成员函数指针时,指向与对象不兼容的成员类型的指针,c++,pointers,function-pointers,member-function-pointers,member-functions,C++,Pointers,Function Pointers,Member Function Pointers,Member Functions,问题 我有一个在运行时分配的成员函数指针数组。我在尝试调用它们时遇到编译时错误: 指向成员类型“void(YCPU:)(uint16_t){aka”void(YCPU:)(短无符号int)}的指针与对象类型“YCPU指令”不兼容` 我很难理解调用指针的正确语法 代码和问题详细信息 我有一个存储两个成员函数指针的structycpu指令。这些函数指针指向YCPU中的成员函数。我存储一个ycpu指令数组,在初始化过程中调用initialize,它将这些指针分配给正确的成员函数 成员函数指针和指令:
ycpu指令
。这些函数指针指向YCPU
中的成员函数。我存储一个ycpu指令数组
,在初始化过程中调用initialize,它将这些指针分配给正确的成员函数
成员函数指针和指令:
typedef void(YCPU::*YCPU操作码)(uint16_t操作码);
typedef std::string(YCPU::*YCPUDisassembler)(std::string name,uint16_t操作数,uint16_t nextword,uint16_t地址,
bool显示内存内容、uint16和指令大小);
结构指令{
std::字符串名;
静态YCPU操作码;
静态拆装器;
整数圈;
布尔是_nop;
void initialize(std::string name,YCPUOpcode操作码,YCPUDisassembler反汇编程序,int cycles,bool is_NOP=false)
{
此->名称=名称;
此->操作码=操作码;
此->反汇编程序=反汇编程序;
这->周期=周期;
这->is\u nop=is\u nop;
}
};
YCPU
YCPU类
{
公众:
//YCPUOpcode指向其中一个函数(比这3个函数多得多,只是示例)
无效NOP(uint16操作码);
无效ADC(uint16操作码);
无效添加(uint16操作码);
...
//YCPUDisassembler指向其中一个函数(比这两个函数多得多,只是示例)
std::string反汇编逻辑单元(std::string name,uint16\u t操作数,uint16\u t nextword,uint16\u t地址,
bool显示内存内容、uint16和指令大小);
std::string反汇编(std::string name,uint16\u t操作数,uint16\u t nextword,uint16\u t地址,
bool显示内存内容、uint16和指令大小);
...
私人:
阵列操作码;
};
在设置过程中,我初始化操作码,如下所示:
void YCPU::run_one_instruction()
{
...
uint16_t word = read_mem_int16(PC, SI_CS); // 0x1-0xff
YCPUInstruction op = opcodes[word & 0xFFFF];
(op.*YCPUInstruction::opcode)(word);
...
}
void YCPU::初始化操作码()
{
操作码[0x01]。初始化(“CMP”、&YCPU::CMP、&YCPU::反汇编运算单元,0);
操作码[0x02]。初始化(“CMP”、&YCPU::CMP、&YCPU::反汇编运算单元,0);
操作码[0x03]。初始化(“CMP”、&YCPU::CMP、&YCPU::反汇编运算单元,0);
…//对于所有指令,依此类推
}
初始化后,我尝试调用成员函数,如下所示:
void YCPU::run_one_instruction()
{
...
uint16_t word = read_mem_int16(PC, SI_CS); // 0x1-0xff
YCPUInstruction op = opcodes[word & 0xFFFF];
(op.*YCPUInstruction::opcode)(word);
...
}
但是,这会抛出我上面提到的编译器错误
如果我先取消引用op
,如下所示:
(op->*ycpu指令::操作码)(word);
我得到这个错误:
错误:“运算符->*”不匹配(操作数类型为“YCPU指令”和“YCPU操作码”{aka'void(YCPU::*)(短无符号整数)})
如果我将语法更改为:
(op->*操作码)(word);
或:
(op.*opcode)(word)
我得到这个错误
错误:“操作码”未在此作用域中声明
调用这些成员函数指针需要使用什么特定语法?的左操作数*必须引用/的左操作数->*必须指向成员函数包含类的对象。右操作数可以是指向成员值的指针的任何表达式 您正在使用的成员函数的包含类是
YCPU
,因此将YCPU指令作为左操作数是不正确的。我看到您的表达式位于YCPU
的另一个成员函数中,因此假设您希望在调用YCPU
函数时使用*this
,则需要this->*
。下面的表达式可以是普通的
或->
表达式,只从ycpu指令
获取而不是调用指向成员函数值的指针。由于*
和->*
的优先级很奇怪,因此经常需要并建议使用过多的括号
void YCPU::run_one_instruction()
{
// ...
uint16_t word = read_mem_int16(PC, SI_CS); // 0x1-0xff
YCPUInstruction op = opcodes[word & 0xFFFF];
(this->*(op.opcode))(word);
// ...
}
根据您的错误消息,听起来好像您试图使用ycpu指令
而不是YCPUOpcode
。什么类型是op
?op是一条指令。抱歉,我将更新代码以显示其类型以及如何分配这些类型描述属于YCPU
成员的函数。那么,您希望this
指向这些函数内部的YCPU
对象是什么呢?您已经将opcode
定义为static
,但试图将其视为成员变量。这是什么意思?@KenWayneVanderLinde你能给我联系一些关于差异的信息吗?我只是在听IDE,忘了添加了那个标识符。YCPU是存储op并在“函数指针的包含类是YCPU
”中调用它的父对象。我想您是指“成员函数”的类吧?指向成员的指针实际上是YCPU指令的数据成员,指向YCPU
的函数成员。