其实callback并不仅限于系统调用,用户根据需要,可以建立自己的Callback机制。比如网络通讯,当接收线程(可能专门有一个类封装网络接收行为)收到数据包,需要通知上层(可能又有一个类封装上层数据处理).
那么我认为Callback最本质的特征包括两点:注册和触发。实现可以是各种各样的形式,但机制都是如此。比如对于两个类而言,给出以下示例代码:
#include <iostream.h>
class B
{
public:
B();
void OnGetMsg(unsigned long ID,const char * MsgName);
private:
unsigned long m_ID;
};
B::B()
{
m_ID = 1002;
}
void B::OnGetMsg(unsigned long ID, const char *MsgName)
{
cout << "srcObjID = " << ID << ", " << "tgtObjID = " << m_ID <<", " <<"Message: " << MsgName << endl;
}
class A
{
public:
A();
void RegisterMsg(B* pb);
void SendMsg(char* msg);
private:
B * m_pb;
unsigned long m_ID;
};
A::A()
{
m_ID = 1001;
m_pb = NULL;
}
void A::RegisterMsg(B* pb)
{
m_pb = pb;
}
void A::SendMsg(char *msg)
{
if(m_pb != NULL)
m_pb->OnGetMsg(m_ID,msg);
}
void main()
{
//产生回调的类对象a
A a;
//相应回调的类对象b
B b;
//A类对象注册
a.RegisterMsg(&b);
//A类对象触发、B类对象响应
a.SendMsg("i'm callback function");
}