c++中使用类语法实现回调(当然,,旧式的C函数指针回调也是支持的)
比如,有人提供一个类库AfCopyFile,能够提供文件拷贝的功能,而且能通知用户当前的进度…
int DoCopy (const char *, const char * dst,AfCopyFileListener *侦听器);
用户只需要自己实现一个AfCopyFileListener对象,传给这个函数就行…
类MainJob:公共AfCopyFileListener { int> AfCopyFile房颤; af.DoCopy(源,dst);>之前
无论是C语言的回调函数,还是c++里的倾听者,都有一个共同的缺点:
它使代码逻辑变得难以阅读。
我们应尽量避免使用回调机制,最好采用单向的函数调用。
<强> AfCopyFile.h 强>
的ifndef _AF_COPY_FILE_H #定义_AF_COPY_FILE_H 类AfCopyFile { 公众://作为内部类 侦听器类 { 公众: 虚拟int> # include & lt; stdio.h> # include & lt; Windows.h> # include“AfCopyFile.h”//将LARGE_INTTEGER类型转成无符号很久 内联unsigned很久翻译(LARGE_INTEGER num) { 无符号=num.HighPart很久结果; 结果& lt; & lt;=32; 结果+=num.LowPart; 返回结果; }//回调函数//注:要求将此函数用关键字回调修饰(这是Windows API的要求) 静态DWORD调CopyProgress ( LARGE_INTEGER TotalFileSize, LARGE_INTEGER TotalBytesTransferred, LARGE_INTEGER StreamSize, LARGE_INTEGER StreamBytesTransferred, DWORD dwStreamNumber, DWORD dwCallbackReason, 处理hSourceFile, 处理hDestinationFile, 值lpData)//& lt; -这个就是上下文件对象 {//计算百分比 无符号长长总=翻译(TotalFileSize); 无符号长长的复制=翻译(TotalBytesTransferred);//打印进度 AfCopyFile::侦听器*侦听器=(AfCopyFile:侦听器*)lpData; 侦听器→OnCopyProgress(总、复制); 返回PROGRESS_CONTINUE; } int AfCopyFile: DoCopy (const char *, const char * dst,侦听器*侦听器) { BOOL ret=CopyFileEx(源、dst ,CopyProgress,//待回调的函数 侦听器,//上下文对象 零(0); 返回ret & # 63;0:1; }<强> main.cpp 强>
# include & lt; stdio.h> # include & lt; string.h> # include“AfCopyFile.h” 类MainJob:公共AfCopyFile::侦听器 { 公众: int DoJob () { strcpy(用户、“shaofa”); strcpy(来源,“c: \ \测试\ \ 2。rmvb”); 拷贝字符串(dst,“c: \ \测试\ \ 2 _copy.rmvb”); AfCopyFile房颤; af.DoCopy(源,dst);//将这传过去 返回0; } int OnCopyProgress(长长的,长长的转移) {//打印进度 int比例=(int)((转移* 100/总)); printf("(用户:% s], % s→% s:进度% d % % \ n”, 用户、源dst、百分比); 返回0; } 私人: 炭源[256]; char dst [256]; 字符用户[64]; }; int main () { MainJob工作; job.DoJob (); 返回0; }
以上就是这篇文章的全部内容,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
c++中如何实现回调的方法示例