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
相关产品推荐
相关产品推荐

