嵌入式环境下C++跨类无虚函数回调实现问询
需求可实现,以下是无虚函数的解决方案
核心思路
让executor持有对应的commandparser对象指针,这样ISR中执行的命令函数就能直接调用该指针的sendresponse方法,完全不需要依赖虚函数或RTTI。
修改后的代码实现
class commandparser; // 前置声明,让executor识别该类型 class executor{ public: // 传入commandparser指针并保存,供后续回调使用 void executeCommand(commandparser* parser){ parser_ptr = parser; // 启动命令执行逻辑,比如触发硬件中断,实际执行过程在ISR中 } private: commandparser* parser_ptr = nullptr; // 保存关联的parser指针 void command1(void){ if(parser_ptr != nullptr){ parser_ptr->sendresponse(1); // 回调parser的响应方法 } } void command2(void){ if(parser_ptr != nullptr){ parser_ptr->sendresponse(2); // 回调parser的响应方法 } } }; class commandparser{ public: void sendresponse(int a){ // 此处编写响应处理逻辑 } void run(){ b.executeCommand(this); // 将当前parser对象的指针传给executor } private: executor b; }; int main(){ commandparser cmdparser; cmdparser.run(); }
方案说明
- 前置声明:提前声明
commandparser类,让executor能识别该类型的指针,解决循环依赖问题。 - 指针传递:调用
executeCommand时,把当前commandparser的this指针传给executor并保存,建立两者的关联。 - 安全调用:命令函数中先判断指针非空,避免嵌入式环境中出现空指针访问的风险。
- 无虚函数/RTTI:全程仅通过对象指针直接调用成员方法,完全符合嵌入式目标平台的限制。
该方案也支持多个commandparser实例,每个executor会持有对应关联的parser指针,互不干扰。
内容的提问来源于stack exchange,提问作者Sivaram
相关产品推荐
相关产品推荐

