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

不同类方法间高效共享数据的设计方案——A封装B/C/D场景

问题:设计B、C、D间的数据流实现数据共享

假设有类A封装了类B、C和D。类B拥有回调函数B::callback(),该函数生成的数据需先经C::foo()处理,最终由D::foo()完成处理。

初始代码如下:

class A{
   public:
      void f(){
         B.run();
         //C.run();
         //D.run();
      }

   private:
      B b;
      C c;
      D d;
};
class B{
   public:
      void run(){
        set_process(callback,void* arg);  // external_lib::set_process
      }
      void callback(){
         data = get_data();
      }

   private:
      float *data;
};
class C{
   public:
      void foo(float *data){
          // 处理数据
      }
};
class D{
   public:
      void foo(float *data){
          // 最终处理数据
      }
};

我的问题是:应如何设计数据流,以实现B、C和D之间的数据共享?


当前基础方案及问题

我当前采用的是一种基础方案:定义一个非成员静态函数void helper(),在B::callback()中调用它,通过成员函数指针调用C::foo()和D::foo(),代码如下:

void helper(float* data,void* args){
    static_cast<C*>(args)->foo(data);
    static_cast<D*>(args)->foo(data);
}

class A{
//...
};
void B::callback(){
    data = get_data();
    void *args = nullptr;
    helper(data,args);
}

但由于我开发的是实时应用,希望找到优化方案。该方案的问题在于类型转换时会创建B和C的副本,我曾考虑将helper()设为A的成员函数A::helper(),通过函数指针传递给B,至少可以对c和d进行引用转换,但这会让逻辑更复杂。


最终可行方案

方案思路

在A中创建成员函数A::share_data,用于将数据传递给C::foo和D::foo,通过创建setter并结合std::function和std::bind将该函数传递给B。这样B就可以调用A的成员函数,将数据共享给其他成员对象。

完整示例代码

class A{
   public:
      void f(){
         b.set_caller(std::bind(&A::share_data,this,std::placeholders::_1));
         B.run();
         //C.run();
         //D.run();
      }
      
      void share_data(float *data){
         c.foo(data);
         d.foo(data);
      }
   private:
      B b;
      C c;
      D d;
};
class B{
   public:
      void run(){
        set_process(callback,void* arg);  // external_lib::set_process
      }
      void callback(){
         data = get_data();
         _share_data(data);
      }

      void set_caller(std::function<void(float*)> A_member_f){
          _share_data=A_member_f;
      }
   private:
      float *data;
      std::function<void(float*)> _share_data;
};

欢迎各位提出意见。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 07:18:23