C中的回调给类成员

前端之家收集整理的这篇文章主要介绍了C中的回调给类成员前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我们为客户提供简单的通信库.

我的问题是:如何从我们客户的类中保存指向方法的指针?

Library.h是头文件,包含客户建立通信所需的所有方法.

library.cpp是我们的代码.在某处我必须保存指向我们客户的回调函数方法的指针.

customer.cpp是客户如何使用我们的库的示例.

library.h:

// This is the header file what our customer gets
class Library {
  public:
    template <class Object,class Function>
    void SetCallback(Object &obj,Function f);
};

library.cpp:

struct T_CUSTOMER {
    Object o;   // <- ???
    Function f; // <- ???
} customer;

void Library::SetCallback(Object &obj,Function f) {
    //Saving the method from our costumer
    customer.o = obj;   // <- ???
    customer.f = f;     // <- ???
}

void someFunction(void) {
    // here i want to call the method from the customer
    customer.o->customer.f(); //<- ???
}

customer.cpp中:

class AnyCustomerClass {
    private:
        Library lib;

    public:
        AnyCustomerClass() {
            //< here the customer sets his method which I should call
            lib.SetCallback(this,&AnyCustomerClass::callback());
        }

        callback() {
            // do something
        }
}

谢谢你的帮助!

解决方法

基本思想是,您定义一个抽象的Callback类,它实际上被传递给您的接口.这个回调函数传递一个int参数:
struct Callback {
  virtual ~Callback(){}
  virtual void operator()(int param)=0;
};

这个类允许你的实现不需要你需要回调的代码的知识.当然,要调用一个类,你需要一个回调的实例,它已知道它的目标.因此,您还提供了一个模板化子类,使您的库用户可以轻松地将其中一个类中的方法绑定到通用Callback的实例: –

template<class T>
class ClassCallback : public Callback {
  T* _classPtr;
  typedef void(T::*fncb)(int param);
  fncb _cbProc;
public:
  ClassCallback(T* classPtr,fncb cbProc):_classPtr(classPtr),_cbProc(cbProc){}
  virtual void operator()(int param){
    (_classPtr->*_cbProc)(param);
  }
};

要从类中创建回调实例,代码将如下所示.调用也很简单:

struct CMyClass {
  Library* _theLibrary;
  CMyClass(Library* init):_theLibrary(init){
    Callback* pCB = new ClassCallback<CMyClass>(&myClass,&CMyClass::OnCb);
    _theLibrary->SetCallback(pCB);
  }
  void OnCb(int){
    // callback triggered
  }
  void Run(){
    _theLibrary->DoWork();
  }
};

总结:Library.h然后会是这样的.定义抽象回调类,库类以及客户用来包装其类及其回调方法的模板化实用程序类:

// This is the header file what our customer gets
struct Callback {... };
class Library {
  Callback* _pcb;
  public:
    void SetCallback(Callback* pcb){_pcb=pcb;}
    void DoWork(){
      int status=0;
      (*pcb)(status);
    }
    ~Library(){delete _pcb;}

};
template<class T> struct ClassCallback{ ... };

猜你在找的C&C++相关文章