You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将成员函数指针作为结构体成员字段来调用成员函数?

如何将成员函数指针作为结构体成员字段来调用成员函数?

兄弟,我看你把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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 10:08:06