社区
C++ 语言
帖子详情
是否可以把类的成员函数设置成回调函数
james_hw
2009-12-02 12:52:20
在做接口时,经常需要使用回调函数将信息反馈给上层,由于涉及到多线程,因此经常会使用id来区别。
我的想法是使用类里面的成员函数作为回调函数,这样就不需要使用id加以区别了。只不过不知道是否可以这么做?
...全文
189
16
打赏
收藏
是否可以把类的成员函数设置成回调函数
在做接口时,经常需要使用回调函数将信息反馈给上层,由于涉及到多线程,因此经常会使用id来区别。 我的想法是使用类里面的成员函数作为回调函数,这样就不需要使用id加以区别了。只不过不知道是否可以这么做?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
16 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
wangxipu
2009-12-03
打赏
举报
回复
static
不过你要用成员变量的时候,还是要定义该变量为static类型的,比较麻烦
james_hw
2009-12-03
打赏
举报
回复
[Quote=引用 13 楼 loaden 的回复:]
如果是线程回调,可以有一个取巧的方法,无需使用thunk。
不知道楼主是否感兴趣?
[/Quote]
非常感兴趣!请教高见!
healer_kx
2009-12-02
打赏
举报
回复
当然可以了。。。 。。。boost::bind...
Thunk太麻烦了。
「已注销」
2009-12-02
打赏
举报
回复
否则,请使用静态成员函数。
「已注销」
2009-12-02
打赏
举报
回复
http://www.vckbase.com/document/finddoc.asp?keyword=thunk
「已注销」
2009-12-02
打赏
举报
回复
可以。
用thunk.
mngzilin
2009-12-02
打赏
举报
回复
呵呵,其实mfc也是用了变通的办法。
你可以将类的this指针作为参数传递到一个全局的afx函数中,然后用这个全局afx函数的参数arg(this)->func再分配到类的成员函数。所以,所有的同类成员“回调”函数都共享这个全局函数。
不过,我觉得delphi解决的更巧妙,你可以到网上查下delphi的相关资料。
「已注销」
2009-12-02
打赏
举报
回复
如果是线程回调,可以有一个取巧的方法,无需使用thunk。
不知道楼主是否感兴趣?
jackzhhuang
2009-12-02
打赏
举报
回复
用static最简单。
其实类的成员函数就是一个全局的带this指针作参数的函数,按这个思路就可以注册成回调函数。
macrojj
2009-12-02
打赏
举报
回复
static 的呗
做一个static的呗
「已注销」
2009-12-02
打赏
举报
回复
[Quote=引用 8 楼 jamesf1982 的回复:]
引用 2 楼 loaden 的回复:
http://www.vckbase.com/document/finddoc.asp?keyword=thunk
除了使用汇编,还有其他的方法吗?
[/Quote]
没有!
damo_xu
2009-12-02
打赏
举报
回复
[Quote=引用 7 楼 jamesf1982 的回复:]
就是不想使用static,希望每个对象的回调函数能自动独立开
[/Quote]
必须使用static。因为回调函数是C风格的,这个函数必须是全局的,所以static也是在C++下的办法。一家之言。
james_hw
2009-12-02
打赏
举报
回复
[Quote=引用 2 楼 loaden 的回复:]
http://www.vckbase.com/document/finddoc.asp?keyword=thunk
[/Quote]
除了使用汇编,还有其他的方法吗?
james_hw
2009-12-02
打赏
举报
回复
[Quote=引用 6 楼 julykey 的回复:]
如果非要设置成成员函数的话,用静态函数,因为它没有指向对象的this指针。见侯捷的《深入浅出MFC》
[/Quote]
就是不想使用static,希望每个对象的回调函数能自动独立开
Julykey
2009-12-02
打赏
举报
回复
如果非要设置成成员函数的话,用静态函数,因为它没有指向对象的this指针。见侯捷的《深入浅出MFC》
「已注销」
2009-12-02
打赏
举报
回复
[Quote=引用 4 楼 healer_kx 的回复:]
当然可以了。。。 。。。boost::bind...
Thunk太麻烦了。
[/Quote]
这个不能用于窗口回调、线程回调、定时器回调的。
C++ 把
类
成员函数
写为
回调函数
回调函数
什么是
回调函数
就不解释了,但为什么要开一篇来特别讲一下如何把
类
成员函数
写
回调函数
? 如果
回调函数
是普通函数,其实普通函数就可以直接拿来当作
回调函数
,在设置
回调函数
中,注意与
回调函数
的返回值
类
型,参数列表一一对应即可 但
类
成员函数
不同,在参数列表中,其实是隐藏了第一个指针型(void*)参数this,这就会导致和设置
回调函数
的参数列表不匹配,没法成功安装 解决方法有三种 将
回调函数
设置为静态 将
回调函数
设置为友元 使用bind绑定 静态 TcpClient.h typedef void(*
如何实现
类
的
成员函数
作为
回调函数
许多程序员都发现,利用MFC或者其它的C++应用编写
回调函数
是非常麻烦的,其根本原因是
回调函数
是基于C编程的Windows SDK的技术,不是针对C++的,程序员可以将一个C函数直接作为
回调函数
,但是如果试图直接使用C++的
成员函数
作为
回调函数
将发生错误,甚至编译就不能通过。通过查询资料发现,其错误是普通的C++
成员函数
都隐含了一个传递函数作为参数,亦即“this”指针,C++通过传递一个指向自身...
C++
类
的
成员函数
做
回调函数
C++
类
的
成员函数
做
回调函数
回调函数
原理: 通过函数指针的传递,使被注册的一方可以通过函数指针找到函数地址,从而实现调用注册进来的函数。 C++
成员函数
和普通C函数的区别: C++
成员函数
隐藏传递一个函数参数(this指针),C++通过传递指向自己的this指针可以使
成员函数
访问自己的成员变量和
成员函数
。
成员函数
作为
回调函数
在注册毁掉函数时,由于隐藏参数this指针就会因为
类
型不匹配从而导致
回调函数
注册失败。在网上查询了一些资料可以通过以下几种方法实现
成员函数
作为
回调函数
: 定义一个普通函数或友元函
类
成员函数
当
回调函数
的方法
普通的C++
成员函数
都隐含了一个“this”指针参数,当在
类
的非静态
成员函数
中访问
类
的非静态成员时,C++编译器通过传递一个指向对象本身的指针给其
成员函数
,从而能够访问
类
的数据成员。也就是说,即使你没有写上this指针,编译器在编译的时候自动加上this的,它作为非静态
成员函数
的隐含形参,对各成员的访问均通过this进行。在创建线程调用
回调函数
时,传入
类
对象的指针(比如this指针)作为参数,并在
回调函数
中把void*强制转换为
类
的指针(MyClass*),就能使用该指针调用
类
的
成员函数
。
C++中
成员函数
如何作为
回调函数
引言 C++中
成员函数
在一般情况下是无法作为
回调函数
的 原因就是因为一般的
成员函数
在传参时为了可以访问成员变量或者返回本身 会默认的传一个 this 指针 但是
回调函数
再触发时会返回参数 这就会导致在把
成员函数
作为
回调函数
的时候会报参数错误这样一种奇怪的错误 那么如何去避免这种情况呢 本文针对此种情况介绍两种方法 一.
类
内静态
成员函数
作为
回调函数
我们报错的原因是因为
成员函数
会隐式的传一个 this 指针,但静态
成员函数
就不会多这一个参数 所以我们的方法就是把
类
内静态成员当做
回调函数
但这又牵扯到一个问题
C++ 语言
65,210
社区成员
250,518
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章