马上撤了,整理下学到的东西
在开发windows客户端时,经常需要用到回调函数,这里就给出回调函数的C++实现
代码
class BaseClassA;
class DerivedClassB :public BaseClassA
{
public:
DerivedClassB(){
Callback::instance()->addDerivedClass(this);
};
~DerivedClassB(){
Callback::instance()->removeDerivedClass(this);
};
void dowork(int a){
//业务逻辑代码
cout << "DerivedClassB";
};
};
//下面代码一般放在库中,ps:放在下面方便加注释
class BaseClassA
{
public:
//此时虚函数和纯虚函数皆可,目的是实现多态,记住,声明纯虚函数的类不能有对象实例
virtual void dowork(int a){
cout << "BaseClassA";
};
//virtual void dowork()=0;
};
//实现回调
#define CALLBACK(fun,argu) for(const auto & iter:m_BaseA)\
{iter->fun(argu); }
class Callback{
public:
Callback(){
//这时候需要调用CALLBACK,也可以放在一个接口中,由派生类调用
//也可以加个定时器一直回调,猜测windows的回调函数应该就是基于此实现
int argu;
CALLBACK(dowork, argu);
}
void addDerivedClass(BaseClassA* a){
m_BaseA.push_back(a);
};
void removeDerivedClass(BaseClassA* a){
auto iter = std::find(m_BaseA.begin(), m_BaseA.end(), a);
if (iter != m_BaseA.end())
{
m_BaseA.erase(iter);
}
};
static Callback* instance(){
//声明一个静态的Callback类指针,如 static Callback* lpCallback;
//主要是需要一个Callback类的静态实例,就不给出实现了
};
private:
//一般需要一个接收派生类指针的容器,将派生类指针赋给基类指针(使基类指针指向派生类对象的地址)
std::list<BaseClassA*> m_BaseA;
};
主要还是依靠多态实现,这里大家应该明白一门语言的多态有多重要了。因为实现给的只是大致框架,肯定是编译不过去的,如果有不懂的可以给我留言哈。