[求助] C++中,回调函数可不可以是类的成员函数?

fibbery 2005-10-21 11:24:26
如果参数规则符合回调函数要求,那么可否使用一个类中的成员函数作为回调函数,如果可以如何调用?如果不可以,为什么?
谢谢!
...全文
1087 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
fatacy 2005-11-01
  • 打赏
  • 举报
回复
mark
fibbery 2005-11-01
  • 打赏
  • 举报
回复
结帖!
fibbery 2005-10-31
  • 打赏
  • 举报
回复
实际上,如果像楼上所说,便也无所谓静态成员函数还是普通成员函数了,反正被回调函数参数接口中必须有一个指针指向其真正的类实例地址了,而在函数中无论使用成员函数还是成员变量都以参数中的类实例指针引用,则完全可以实现类的成员函数作为回调函数。

K 2005-10-21
  • 打赏
  • 举报
回复
必须是静态的
wshcdr 2005-10-21
  • 打赏
  • 举报
回复
必须是静态的
chenhu_doc 2005-10-21
  • 打赏
  • 举报
回复
恩 好多猩猩 和星星啊
useresu 2005-10-21
  • 打赏
  • 举报
回复
该说的温柔和zark都说了

静态可以
Jarrylogin 2005-10-21
  • 打赏
  • 举报
回复
静态成员函数反映的是类的属性,而不是实例的属性。
foochow 2005-10-21
  • 打赏
  • 举报
回复
static函数,要不参数不匹配
steel007 2005-10-21
  • 打赏
  • 举报
回复
需要是静态函数,static member function,普通的成员函数都有一个隐式的this指针,但是对于毁掉函数,这个指针是不能够要的,static member funtion就没有这个this指针。
Zark 2005-10-21
  • 打赏
  • 举报
回复
可以,但必须是静态成员函数.
StevenKong 2005-10-21
  • 打赏
  • 举报
回复
应该是不可以的,分析如下,请大家指正
多个类的实例共享成员函数空间,但有独立的成员变量空间,假设可以,在执行回调函数时,如果成员函数有访问成员变量的行为,这时候存在多个类的实例,那么它就不知道去访问哪一个实例的成员变量
格兰特杨 2005-10-21
  • 打赏
  • 举报
回复
这个参数我一般传的就是this指针...
大家可以交流一下使用WINAPI回调的经验啊。但有必要指出,回调可不单单指回调WINAPI啊。

:)
blackwater 2005-10-21
  • 打赏
  • 举报
回复
搂主的问题非常好,我在工作中也确实碰到这个问题,
比如我实现了一个网络通讯的接口,在实现函数中我调用了某一个API,这个API建立和远程的连接,同时这个API需要一个回调函数当网络有问题的时候调用这个回调函数进行处理,那末我们面临一个问题,这个回调函数只应该是类的一个静态函数,但是问题是在静态函数总我们不可以访问类的专有信息。
我们可以借鉴WINDOWS的完成端口,要求那个API给我们预留一个自定义的参数,当他回调我们给他的那个函数的时候,再把这个自定义参数返回给我们,哈哈,有了这个自定义的参数我们就可以为所欲为了。这就要求在设计API的时候,必须充分的考虑,如果哪个API没有给你预留一个参数,那个这个API我们就只能丢弃了,因为在这种情况下至少我没有很好的解决方案
格兰特杨 2005-10-21
  • 打赏
  • 举报
回复
啊,wanguodu兄。我不是针对你。只是看着大家都说“必须是静态的”,其实,不必须啊...。
wanguodu 2005-10-21
  • 打赏
  • 举报
回复
楼上的,你没懂我的意思,不好的设计并不等于不能实现。我之所以那样说,是因为在C++中完全可以用虚函数达到回调函数同样的效果,甚至更好。
格兰特杨 2005-10-21
  • 打赏
  • 举报
回复
只要能找得到与之对应的类的对象指针,便可用形如
p->*foo()

这样的方法来回调。
格兰特杨 2005-10-21
  • 打赏
  • 举报
回复
没什么不可以,在有继承关系的类间和类自身,只要调用时注意方式

class CTestClass
{
private:
typedef int (CTestClass::*FUNCPTR)(int, int);
int _A, _B;
int getPlusResult(int A, int B)
{
return A + B;
}
int getMultiplyResult(int A, int B)
{
return A * B;
}
protected:
int f(int a, int b, FUNCPTR ptr)
{
return (this->*ptr)(a, b);
}
public:
int GetAPlusB()
{
return f(_A, _B, getPlusResult);
}
int GetAMultiplyB()
{
return f(_A, _B, getMultiplyResult);
}
CTestClass(int A, int B): _B(B), _A(A) {};
~CTestClass(void);
};
wanguodu 2005-10-21
  • 打赏
  • 举报
回复
在C++中使用回调函数本身就不是好的设计,除非你的下层接口软件是用C写的。
bm1408 2005-10-21
  • 打赏
  • 举报
回复
class A
{
public:
static void callme()
{

}

}

这个callme就可以做为回调函数
加载更多回复(3)

64,651

社区成员

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

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