博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ 成员函数 回调函数的实现
阅读量:6807 次
发布时间:2019-06-26

本文共 2443 字,大约阅读时间需要 8 分钟。

hot3.png

1.回调函数的说明:
在进行软件开发的过程中,常会用到一些声明为CALLBACK的函数,这些函数就是回调函数。使用
回调函数可以改善软件的结构、提高软件的复用性。比如,在一个规模较大的软件项目中,可以将一些资
源或相对独立的处理模块封装到动态连接库(DLL) 中,然后通过回调函数在不同的场合来使用这些资源
和模块。利用回调函数还可以进行程序间复杂的通信,实现一些通知的功能,在某些场合它是比消息更
合适的一种方式;在一些特殊的情况下,回调函数更有不可替代的作用。Win32 API 中有许多回调函数的
应用,在进行软件设计时也会经常用到这种函数,而有些时候则需要编写自己的回调函数。因此,理解回
调函数的原理并掌握它的基本用法是非常必要的。
C ++ 是当代使用最广泛的语言,从嵌入式系统到大型机系统、从LINUX 到WINDOWS ,在大型系统的
编制中,到处都是它的身影。它以高效和易编程性获得了许多资深程序员的信赖。在DirectX Play 开发过
程中,经常需要使用到回调函数,直接使用回调函数显得复杂麻烦,采用用C + + 实现对回调函数的封装,
使回调函数变得方便实用,对于DirectX Play 等编程就显得是非常有意义的。
回调函数简单讲就是一个函数指针。写一个函数,然后把函数地址传递给这个函数指针就可以了。
回调函数的原形对C ++ 的成员函数用做回调函数的影响是什么?
编写回调函数简单地说就是函数原形一致。函数的输入参数,输出参数一致是很容易保证的。要注
意调用类型一致性。函数传参数有好几种类型,搞错了传参数的方式,系统必然运行错误。一般来说都
是WINAPI 传参数方式。要注意C ++ 的类的成员函数和一般的C 函数的区别。C + + 类采用this 规则传
递函数。在使用类的成员函数作为回调函数,要求该成员函数被声名为静态成员函数,并且注意函数声
名的时候要同时声明好参数传递规则。
 
2.我的回调函数的理解,
 
模块A ,模块B,
如果模块B 中调用模块A 的东西, 在模块A中发生一个事件或操作,调用B的函数处理,
这就才用了回调函数的机制。
3.例子的实现
模块A的代码
#ifndef __A_H
#define __A_H
class A
{
public:
A(void){}
public:
~A(void){}
typedef void (*perfect)(int );  //声明回调函数
public:
void CallBackFunc(void (*perfect)(int ),int n)  //给模块B调用的函数
{
   perfect(n);  //调用的函数
}
};
#endif  //__A_H
模块B的代码
#include <iostream>
#include "A.h"
using namespace  std;
void perfect(int n)   //这个函数要求是全局的,或者是类中的静态成员变量
{
cout<<n<<endl;
}
int main()
{
A a;
a.CallBackFunc(perfect,100);    //调用模块A的代码。
return 0;
}
静态成员函数调用非静态成员函数  应用于回调函数
代码如下
模块A的代码
#ifndef __CALLBACKTEST_H
#define __CALLBACKTEST_H
class CallBackTest
{
public:
CallBackTest(void);
public:
~CallBackTest(void);
typedef void (*perfect)(void*,int );  //声明回调函数
public:
   void CallBackFunc(void* pThisOBject,void (*perfect)(void*,int ),int n)
{
p=perfect;
m_n=n;
m_pThisObject=pThisOBject;
}
   void ExecBackFunc()
   {
p(m_pThisObject,m_n);
   }
private: 
perfect  p;
int m_n;
void* m_pThisObject;
};
#endif //__CALLBACKTEST_H
模块B的代码
#include <iostream>
#include "CallBackTest.h"
using namespace std;
class testMai
{
public:
static void perfect(void *pdata,int n)
{
testMai* pObject=(testMai*)pdata;
pObject->test(n);
}
void Exec()
{
CallBackTest callbackTest;
callbackTest.CallBackFunc(&this,perfect,100);
cout<<"ni hao"<<endl;
callbackTest.ExecBackFunc();
}
void test(int n)
{
int i=1;
int count=0;
m=9;
for(i=1;i<n;i++)
{
if(0==n%i)
{
count+=i;
}
}
if(count==n)
//printf("%d是完数\n",n);
{
cout<<n<<"是完数"<<endl;
}
else 
{
cout<<n<<"bu shi de "<<endl;
}
}
private:
int m;
};
int main()
{
testMai testMai;
testMai.Exec();
return 0;
}

转载于:https://my.oschina.net/u/438140/blog/57571

你可能感兴趣的文章
【mysql的编程专题①】流程控制与其他语法
查看>>
[译] 实例解析 ES6 Proxy 使用场景
查看>>
JavaScript_高程三_01
查看>>
解决 css 浮动后 父元素高度失效问题
查看>>
使用VisualSVN Server搭建SVN版本控制服务器
查看>>
OpenGL ES2 学习教程5——顶点属性
查看>>
谈谈BFC与ie特有属性hasLayout
查看>>
Git 命令速查表
查看>>
Coder Essential之编程语言学习知识点纲要
查看>>
ES6 走马观花(ECMAScript2015 新特性)
查看>>
微信支付坑 一两点
查看>>
无锁算法
查看>>
Wordpress 5.2 beta 2 发布,支持 Emoji 12
查看>>
Drupal 曝出代码执行高危漏洞,数百万网站受影响
查看>>
《TCP IP 详解卷1:协议》阅读笔记 - 第十四章
查看>>
文字与编码的奥妙(上篇)
查看>>
适用与IOS手机的python编辑器,让你不限空间,地点都能玩转pyhton代码 ! ...
查看>>
【直播预告】云栖社区特邀专家蒋泽银:Jpom一款低侵入式Java运维、监控软件 ...
查看>>
零跑C-more收获更多期待,而零跑S01还在追求更多的订单 | 2019 上海车展 ...
查看>>
想成长为一名年薪50万+的实战型架构师?必掌握这7大实战技能经验
查看>>