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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 20:05:17