如何将成员函数指针作为结构体成员字段来调用成员函数?
如何将成员函数指针作为结构体成员字段来调用成员函数?
兄弟,我看你把C代码移植到C类的时候,卡在成员函数指针的调用上了。其实核心原因很简单:C的成员函数指针和普通C函数指针不一样——它必须绑定具体的对象实例才能调用,因为成员函数背后隐含了this指针,用来指向当前操作的对象。
先给你梳理正确的步骤:
1. 确认成员函数指针的赋值是正确的
你在main函数里的最后一次赋值是对的:
my_object.struct_with_func_ptr_data_member.func_ptr_member = &MY_CLASS::func_to_be_assigned_to_func_ptr;
成员函数指针必须通过&类名::成员函数的形式取地址,不能直接用对象的成员函数名,这点你做对了。
2. 正确调用成员函数指针的写法
你之前在func_to_make_use_of_func_ptr里的几次尝试都没用到正确的操作符。在成员函数内部,我们需要用this->*(因为当前在类的成员函数里,this指向当前对象实例)把对象和成员函数指针绑定,然后再调用。
修改后的func_to_make_use_of_func_ptr实现如下:
void MY_CLASS :: func_to_make_use_of_func_ptr ( uint8_t in_uint8 ) { // 先取出结构体中的成员函数指针,这样代码更清晰 func_ptr_type target_func = struct_with_func_ptr_data_member.func_ptr_member; // 绑定当前对象并调用,括号不能省略! uint8_t * ptr_to_uint8_t = (this->*target_func)(in_uint8); std :: cout << "data member array value @ index " << unsigned ( in_uint8 ) << " = " << unsigned ( * ptr_to_uint8_t ) << std :: endl ; }
如果想写得更紧凑,也可以直接合并成一行:
uint8_t * ptr_to_uint8_t = (this->*struct_with_func_ptr_data_member.func_ptr_member)(in_uint8);
为什么要这么写?
- 成员函数指针本身只记录了成员函数在类中的位置,不包含对象信息,必须指定哪个对象来调用这个函数。
this->*操作符的作用就是把当前对象(this指向的实例)和成员函数指针绑定起来,让编译器知道要操作哪个对象的成员。- 括号不能省略:因为函数调用的优先级比
->*高,如果不加括号,编译器会先尝试调用target_func(in_uint8),这显然是错误的,因为成员函数指针不能直接调用。
修改后你的代码应该就能正常编译运行了。
备注:内容来源于stack exchange,提问作者Mario Christov
相关产品推荐
相关产品推荐

