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

嵌入式环境下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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 00:21:41