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

Arduino C++11下动态创建并执行实例化类成员函数指针列表

Arduino C++11 实例化类成员函数动态调用列表实现

需要实现一个动态列表,存储不同类实例的成员函数指针,在主程序中统一调用这些函数。以下是完善后的代码实现:

1. 改进后的基类(base)

#include <functional>
#include <vector>

class base {
private:
    // 存储绑定了实例的可调用对象列表
    static std::vector<std::function<void()>> function_list;
    
    friend class class_inp;
    friend class class_out;
    
    // 添加绑定后的函数对象到列表
    static void base_add_function(std::function<void()> func) {
        function_list.push_back(func);
    }

public:
    // 遍历执行列表中所有函数
    static void execute_dynamic_list() {
        for (auto& func : function_list) {
            func();
        }
    }
};

// 静态成员变量必须在类外初始化
std::vector<std::function<void()>> base::function_list;

2. 输入类(class_inp)实现

class class_inp : public base {
public:
    class_inp(bool eventSwitch) {
        // 绑定当前实例的成员函数,转为无参可调用对象
        base_add_function(std::bind(&class_inp::upddate_event_control, this));
    }
    
    void upddate_event_control() {
        // 这里实现输入类的事件控制逻辑
        // 示例:Serial.println("class_inp event updated");
    }
};

3. 输出类(class_out)实现

class class_out : public base {
public:
    class_out(/* 自定义参数 */) {
        // 绑定当前实例的成员函数
        base_add_function(std::bind(&class_out::upddate_event_control, this));
    }
    
    void upddate_event_control() {
        // 这里实现输出类的事件控制逻辑
        // 示例:Serial.println("class_out event updated");
    }
};

4. 主程序(Arduino 代码)

// 实例化对象,构造时自动将成员函数加入列表
class_inp inp(true);
class_out out(/* 传入参数 */);

void setup() {
    // 初始化操作,比如串口
    // Serial.begin(9600);
}

void loop() {
    // 统一调用所有注册的成员函数
    base::execute_dynamic_list();
    delay(1);
}

关键说明

  • std::function与std::bind的作用:类的非静态成员函数必须依赖实例对象才能调用,std::bind可以将实例指针(this)和成员函数绑定成一个无参的可调用对象,存入std::vector<std::function<void()>>列表中。
  • 静态成员初始化:base类中的function_list是静态成员,必须在类外部完成初始化,否则会出现链接错误。
  • 实例生命周期:确保class_inp和class_out的实例生命周期长于function_list,否则调用时会访问悬空指针(比如不要在函数内创建局部实例,除非确保列表在实例销毁前清空)。
  • 扩展方向:如果需要支持移除函数,可以给base类添加移除方法(比如根据索引或函数对象查找删除),或者使用std::list代替std::vector以提高删除效率。

内容的提问来源于stack exchange,提问作者jebmdk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 02:12:13