C++类中能否定义指向成员函数指针的指针?
在C类中定义指向成员函数指针的指针数组(C11)
核心结论
完全可以在类内部定义指向类成员函数指针的指针数组,你的问题出在类型声明语法错误,而非思路不可行。
错误分析
你写的void*(battery::*enable_ptr[2])(void);实际声明的是:一个包含2个元素的数组,每个元素是「返回void*的battery类成员函数指针」,这和你想要的「指向成员函数指针的指针」完全不是一回事。
正确的指向成员函数指针的指针类型语法应该是:
// 单个指针:指向「void battery::*()」类型的指针 void (battery::**ptr_to_memfunc_ptr)(); // 数组形式:包含2个上述指针的数组 void (battery::**enable_ptr[2])();
修正后的代码示例
#include <iostream> #include <cstdint> // 适配uint8_t类型 // 用using定义成员函数指针的类型别名,简化复杂类型的书写(C++11支持) using MemFuncPtr = void (battery::*)(); class battery{ public: bool enable; uint8_t port; // 成员函数指针数组:直接存储成员函数指针 MemFuncPtr func_ptr[2]; // 指向成员函数指针的指针数组:存储MemFuncPtr类型的指针 MemFuncPtr* enable_ptr[2]; battery(uint8_t _battery, bool _enable): enable(_enable), port(_battery) { // 初始化成员函数指针数组 func_ptr[0] = &battery::set_ports_low; func_ptr[1] = &battery::set_ports_high; // 初始化指向成员函数指针的指针数组:取func_ptr元素的地址 enable_ptr[0] = &func_ptr[0]; enable_ptr[1] = &func_ptr[1]; } void set_ports_low(){ std::cout << "Ports set low\n"; } void set_ports_high(){ std::cout << "Ports set high\n"; } }; int main() { battery bat(1, true); // 调用方式:两次解引用拿到成员函数指针,结合对象调用(括号避免运算符优先级问题) (bat.**bat.enable_ptr[0])(); // 等价于 bat.set_ports_low() (bat.**bat.enable_ptr[1])(); // 等价于 bat.set_ports_high() return 0; }
语法细节说明
- 成员函数指针的调用必须依赖类对象,因此通过指针的指针调用时,需要两次解引用:
**enable_ptr[0]得到成员函数指针,再结合对象bat使用(bat.**...)()的语法。 - C++11的
using类型别名比传统typedef更直观,尤其适合复杂的成员函数指针类型。
实际应用场景
在你的电池充电器开发场景中,这种写法的典型用途包括:
- 状态机实现:把预充电、恒流充电、恒压充电、浮充等不同阶段的控制函数指针存入数组,通过指向指针的指针动态切换当前状态对应的函数,替代大量嵌套
if/else或switch,代码更简洁易维护。 - 动态配置函数组:针对锂聚合物、铅酸等不同电池类型,预先定义多组控制函数指针数组,通过指向指针的指针快速切换到对应组的函数集合。
- 运行时动态修改函数实现:如果需要在程序运行时替换某个功能的逻辑,通过指针的指针可以直接修改指向的成员函数指针,无需改动数组本身。
关于C++11兼容性
Atmel Studio配套的AVR-GCC完全支持C++11的成员函数指针及指针的指针语法,你遇到的问题只是语法错误,并非功能缺失。
内容的提问来源于stack exchange,提问作者Some random guy
相关产品推荐
相关产品推荐

