如果要在两个class对象之间传递数据,最简单直接的方法在一个类中定义一个全局变量,然后在另一个类里面extern这个变量,这样就等于这个全局变量同时作用于两个类对象中,这样做能暂时解决问题,然而可能会出现新的问题,比如,代码的复用性不好,全局变量会在main之前初始化,增加了程序的负担;还有一个致命的问题,如果是多线程程序,就需要加锁保证同一时刻只能有一个对象在访问修改这个全局变量,程序的效率可能会下降,当然如果定义的全局变量过多,由于加锁不慎很可能会导致死锁,致使程序奔溃,今天介绍一中很实用的办法,线程安全并且封装性好;先看代码
#include <iostream>
using namespace std;
typedef void(*CallBack)(char* s);
class A{
public:
void setCbk(CallBack call_back){
this->_my_call_back = call_back;
_my_call_back("123456789");
}
public:
A(){}
~A(){}
CallBack _my_call_back;
};
class B{
public:
static void OnCallBack(char * s){
cout << "gxs s:" << s << endl;
}
public:
B(){
A a;
a.setCbk(B::OnCallBack); //注册回调函数,将ts_data_input和当前类注册到类PlayerRelay中
}
~B(){}
};
int main()
{
B b;
return 0;
}
首先typedef void(*CallBack)(char* s)申明了一个函数指针,这个CallBack指针指向一个返回值是void类型参数是char*的函数;那怎么才能让类A的char*数据传到类B来呢,读代码就知道了,很简单在类A里面定义一个CallBack的成员变量,然后把类B的OnCallBack的地址赋值给A的CallBack,这样A的CallBack在执行的时候就会执行B的OnCallBack的代码了;
该怎么理解呢,理解这个原理首先得理解函数指针的含义,顾名思义,函数指针它是一个指针,这个指针指向的是一个函数。这个意思就是你可以通过一个指针去调用一个函数,所以你想调用别的类的函数,就要把它类里面这个函数的地址获取到赋值到你类里面的函数指针。
其实,这是回调函数最原始的做法,很多IDE已经开发出非常高校便捷的回调形式,最经典的莫过于Qt的信号槽机制了,它做的太好了,好到你可以任意的设置回调的接口而不必关心这个谁去发起这个连接,换句话说就是你在Class A中设置回调的时候class B这个对象不存在也没关系;