c语言callback函数用法,c语言callback
回调函数是一个很有用,也很重要的概念。当发生某种事件时,系统或其他函数将会自动调用你定义的一段函数。回调函数在窗子编程使用的场合很多,比如钩回调函数:MouseProc,GetMsgProc以及EnumWindows,DrawState的回调函数等等,还有很多系统级的回调过程。一般情况下,我们使用的回调函数基本都是采用C语言风格。这里介绍一种C风格的回调对象方法。采用模板实现。
查看剪贴板打印文本?
模板类类,typename返回类型,typename参数
类SingularCallBack
{
公共:
typedef ReturnType(类:*方法)(参数);
SingularCallBack(Class * _ Class _ instance,Method _method)
{
//取得对象实例地址,及调用方法地址
class _ instance=_ class _ instance;
方法=_方法
};
返回类型运算符()(参数参数)
{
//调用对象方法
return(class _ instance-*方法)(参数);
};
ReturnType执行(参数参数)
{
//调用对象方法
返回运算符()(参数);
};
私人:
类别*类别实例
方法方法;
};
模板类类,typename返回类型,typename参数
类SingularCallBack
{
公共:
typedef ReturnType(类:*方法)(参数);
SingularCallBack(Class * _ Class _ instance,Method _method)
{
//取得对象实例地址,及调用方法地址
class _ instance=_ class _ instance;
方法=_方法
};
返回类型运算符()(参数参数)
{
//调用对象方法
return(class _ instance-*方法)(参数);
};
ReturnType执行(参数参数)
{
//调用对象方法
返回运算符()(参数);
};
私人:
类别*类别实例
方法方法;
};
示例:
以下是两个类实现。
查看剪贴板打印文本?
A级
{
公共:
无效输出()
{
std:cout 我是A级:D的STD:endl;
};
};
B类
{
公共:
布尔方法乙(甲)
{
答。output();
返回真实的
}
};
A级
{
公共:
无效输出()
{
std:cout 我是A级:D的STD:endl;
};
};
B类
{
公共:
布尔方法乙(甲)
{
答。output();
返回真实的
}
};
SingularCallBack的各种调用示例:
查看剪贴板打印文本?
一个
电子商务
SingularCallBack B,bool,A * cb
cb=new SingularCallBack B,bool,A ( b,B:methodB);
如果((*cb)(a))
{
std:cout 回调成功激发!STD:endl;
}
其他
{
std:cout 回调触发不成功!STD:endl;
}
一个
电子商务
SingularCallBack B,bool,A * cb
cb=new SingularCallBack B,bool,A ( b,B:methodB);
如果((*cb)(a))
{
std:cout 回调成功激发!STD:endl;
}
其他
{
std:cout 回调触发不成功!STD:endl;
}
查看剪贴板打印文本?
一个
电子商务
SingularCallBack B,bool,A * cb
cb=new SingularCallBack B,bool,A ( b,B:methodB);
if(cb- execute(a))
{
std:cout 回调成功激发!STD:endl;
}
其他
{
std:cout 回调触发不成功!STD:endl;
}
一个
电子商务
SingularCallBack B,bool,A * cb
cb=new SingularCallBack B,bool,A ( b,B:methodB);
if(cb- execute(a))
{
std:cout 回调成功激发!STD:endl;
}
其他
{
std:cout 回调触发不成功!STD:endl;
}
查看剪贴板打印文本?
一个
电子商务
SingularCallBack B,bool,A cb( b,B:methodB);
if(cb(a))
{
std:cout 回调成功激发!STD:endl;
}
其他
{
std:cout 回调触发不成功!STD:endl;
}
一个
电子商务
SingularCallBack B,bool,A cb( b,B:methodB);
if(cb(a))
{
std:cout 回调成功激发!STD:endl;
}
其他
{
std:cout 回调触发不成功!STD:endl;
}
查看剪贴板打印文本?
a级
{
公共:
a类(无符号int _ id):id(_ id){ };
~ a class(){ };
布尔方法(标准:字符串str)
{
STD:cout a class[ id ]: str STD:endl;
返回真实的
};
私人:
无符号整数id;
};
typedef SingularCallBack AClass,bool,STD:string a callback;
int main()
{
STD:vector a回调callback _ list
a类a1(1);
a类a2(2);
a3类(3);
回调_列表。push _ back(一个回调(a1,a class:AMethod));
回调_列表。push _ back(一个回调(a2,a class:AMethod));
回调_列表。push _ back(一个回调(a3,a class:AMethod));
对于(无符号int I=0;我回调_列表。size();我)
{
callback _ list[I]( ABC );
}
对于(无符号int I=0;我回调_列表。size();我)
{
回调_列表[我].执行(‘ABC’);
}
返回真实的
}
a级
{
公共:
a类(无符号int _ id):id(_ id){ };
~ a class(){ };
布尔方法(标准:字符串str)
{
STD:cout a class[ id ]: str STD:endl;
返回真实的
};
私人:
无符号整数id;
};
typedef SingularCallBack AClass,bool,STD:string a callback;
int main()
{
STD:vector a回调callback _ list
a类a1(1);
a类a2(2);
a3类(3);
回调_列表。push _ back(一个回调(a1,a class:AMethod));
回调_列表。push _ back(一个回调(a2,a class:AMethod));
回调_列表。push _ back(一个回调(a3,a class:AMethod));
对于(无符号int I=0;我回调_列表。size();我)
{
callback _ list[I]( ABC );
}
对于(无符号int I=0;我回调_列表。size();我)
{
回调_列表[我].执行(‘ABC’);
}
返回真实的
}
引用:
c回调解决方案(http://www。再见。net/编程/模板回调/索引。html)
本文来自程序员博客,转载请标明出处:http://博客。csdn。net/force _ eagle/archive/2009/07/14/4347329。文件
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。