如何在类中定义回调函数?

Hinagi 2010-01-12 05:22:28
timeSetEvent(1000, 1, this->TimerProc, 0, TIME_CALLBACK_FUNCTION);
第三个参数是一个回调函数,我这样用会报错
error C3867: 'CMani::TimerProc': function call missing argument list; use '&CMani::TimerProc' to create a pointer to member


下面是回调函数的声明和定义:
**.h
LRESULT WINAPI DoTimerProc(UINT, UINT, DWORD, DWORD, DWORD);
**.cpp
LRESULT WINAPI CMani::TimerProc(UINT uTimerID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2){...}

应该怎么用才不会报错啊,不要告诉把TimerProc定义成static的,里面会处理其他的类成员.


谢谢
...全文
289 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
traceless 2010-01-12
  • 打赏
  • 举报
回复
不妥,声明为static局限性也很大。

这个static函数所调用的函数和变量都得声明为static,很容易破坏
数据的安全性和封装性。光是都声明为static,那么这个函数也就没有必要成为类的函数了
FrankSun80 2010-01-12
  • 打赏
  • 举报
回复
这样最省事,传实例指针进去也是一样的

[Quote=引用楼主 kenshintang1215 的回复:]
应该怎么用才不会报错啊,不要告诉把TimerProc定义成static的,里面会处理其他的类成员.
[/Quote]
FrankSun80 2010-01-12
  • 打赏
  • 举报
回复
这样最省事,传实例指针进去也是一样的

[Quote=引用楼主 kenshintang1215 的回复:]
应该怎么用才不会报错啊,不要告诉把TimerProc定义成static的,里面会处理其他的类成员.
[/Quote]
ztenv 版主 2010-01-12
  • 打赏
  • 举报
回复
改为:static吧,这是最简单的改法,然后传的时候:类名::函数名;
traceless 2010-01-12
  • 打赏
  • 举报
回复
首先要知道类函数和普通函数的自定义是不一样的

普通函数:typedef void (*pFun)();
类函数:typedef void (CMani::*pFun)();

像这种情况:
timeSetEvent(1000, 1, this->TimerProc, 0, TIME_CALLBACK_FUNCTION);
1、假设timeSetEvent是第三方的的函数,传this指针,更不行,那边不知道你的类声明。
除非双方都有实现类的声明或实现类对应的接口(也就是对应的头文件是公开的)。

2、如果要像普通函数那样来进行处理,有一种方法可以,声明一个友元函数,用友元对
类函数进行封装。
macrojj 2010-01-12
  • 打赏
  • 举报
回复
你必须要把CMani对象传进去
耍宝王 2010-01-12
  • 打赏
  • 举报
回复
为什么你声名的时候是
LRESULT WINAPI DoTimerProc(UINT, UINT, DWORD, DWORD, DWORD);
实现的时候是
LRESULT WINAPI CMani::TimerProc(UINT uTimerID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2){...}
Do去哪了?
xixiaoliu 2010-01-12
  • 打赏
  • 举报
回复
static 或者把它移出类,或者其他办法
另外想办法把 this 指针丢给 TimerProc

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧