如何在回调函数中调用某个类的成员函数?

CunningBoy 2003-09-27 11:46:42
我的程序中需要在回调函数中使用类的成员函数,但是我看了好多人的帖子都说回调函数必须是全局的或是类的静态函数,这样以来我在这个回调函数中使用类的其他成员函数就不行了。请问我该如何处理这个问题啊?请说明清楚一点,最好是有一段示例代码。谢谢!
下面是我的程序的部分示例代码:

class DDN
{
public:
bool sen(char a);
}

void callback(char b) //callback是一个回调函数
{
……
DDN* p
p->sen(b); // 这句在运行时会出错
……
}

另:我的回调函数不是被系统调用的,而是被我自己写的动态连接库调用的。
...全文
78 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaohyy 2003-09-28
  • 打赏
  • 举报
回复
照楼上的方法就可以了。。

wangbab 2003-09-28
  • 打赏
  • 举报
回复
回调函数作为类的静态成员函数定义。传入类的指针。
比如CListCtrl的排序函数
BOOL SortItems(
PFNLVCOMPARE pfnCompare,
DWORD_PTR dwData
);

这里pfnCompare就是自己定义的一个回调函数。定义如下:
//lParam3为传入的参数this
int CALLBACK CMyListCtrl::CompareFunc(LPARAM lParam1,LPARAM lParam2,
LPARAM lParam3)
{
CMyListCtrl *pList=(CMyListCtrl*)lParam3;
//以后就可以用pList访问CMyListCtrl中的成员
}
//调用如下
SortItems(CompareFunc,this);
bluebohe 2003-09-28
  • 打赏
  • 举报
回复
p放入参数或者全局变量中,总之保持唯一
ringphone 2003-09-28
  • 打赏
  • 举报
回复
是你自己写的动态连接库调用就好办了,把对象指针传给回调函数就行了,修改一下callback:

void callback(DDN* p,char b) //callback是一个回调函数
{
……
if(p != NULL)
p->sen(b);
……
}

如果是系统调用,比如自己封装的窗口类,窗口过程必须是全局或静态成员函数,这时你怎么得到对象指针呢?
wangbab 2003-09-28
  • 打赏
  • 举报
回复
to wangbab(bab)
为什么int CALLBACK CMyListCtrl::CompareFunc(LPARAM lParam1,LPARAM lParam2,
LPARAM lParam3)
有3个参数
而传进去只有一个lParam3
那么LPARAM lParam1,LPARAM lParam2 可以不要?


是有3个参数。lParam1和lParam2是要比较条目的编号。lParam3才是传入的this指针。不过你要做类型转换。
lidopaul 2003-09-28
  • 打赏
  • 举报
回复
定义一个全局指针
DDN *g_pDDN;
然后再在ddn的构造函数中如此写即可:
DDN::DDN()
{
g_pDDN = this;
}

class DDN
{
public:
bool sen(char a);
}

void callback(char b) //callback是一个回调函数
{
……
// DDN* p
// p->sen(b); // 这句在运行时会出错
g_pDDN->sen(b);//如此调用即可
……
}
ljp940531 2003-09-28
  • 打赏
  • 举报
回复
to wangbab(bab)
为什么int CALLBACK CMyListCtrl::CompareFunc(LPARAM lParam1,LPARAM lParam2,
LPARAM lParam3)
有3个参数
而传进去只有一个lParam3
那么LPARAM lParam1,LPARAM lParam2 可以不要?

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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