请教一个关于类成员回调的问题。

二楼の五号 2011-02-16 03:00:19
关于类成员回调的问题。我的想通过代码实现如下功能 B.Start() -> A.CallBack() -> B.fncallback()
代码如下:

class A
{
public:
inline void CallCallBack(void(*lpfn)(LPCTSTR),LPCTSTR lpstr)
{
(*lpfn)(lpstr);
}
};

class B
{
public :
inline void fncallback(LPCTSTR lpstr)
{
::MessageBox(NULL,lpstr,NULL,MB_OK);
}
inline void Start()
{

union
{
void(*lpfn1)(LPCTSTR);
void(B::*lpfn2)(LPCTSTR);
} _proc;
_proc.lpfn2 = &B::fncallback ;

A a;
a.CallCallBack(_proc.lpfn1,_T("callback string!"));
}
};

int main()
{
B b;
b.Start();

system("pause");
return 0 ;
}

调用过程成功了,MessageBox弹出来了,但是运行到下一步就提示错误
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.

不知问题在哪里。如要实现这个功能有没好的办法?
望指教!
...全文
1076 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
coderchenjingui 2013-01-14
  • 打赏
  • 举报
回复
类非静态成员函数有一个static指针,这个怎么实现回调
喧嚣天空 2012-12-19
  • 打赏
  • 举报
回复
N比 学习了。
管哥的天下 2011-02-18
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 myxy82 的回复:]
感谢,确实如此。改成 _stdcall 就不报错了。
[/Quote]

怎么改!!!求教?
欣客 2011-02-16
  • 打赏
  • 举报
回复
学习了,原来通过传递给一个类来避免this指针的产生。
真是高手啊 ,这也想得到。。。
二楼の五号 2011-02-16
  • 打赏
  • 举报
回复
感谢,确实如此。改成 _stdcall 就不报错了。
  • 打赏
  • 举报
回复
vc默认的是__thiscall,你改成__stdcall就好了
  • 打赏
  • 举报
回复

class A
{
public:
inline void CallCallBack(void(__stdcall *lpfn)(LPCTSTR),LPCTSTR lpstr)
{
(*lpfn)(lpstr);
}
};

class B
{
public :
inline void fncallback(LPCTSTR lpstr)
{
::MessageBox(NULL,lpstr,NULL,MB_OK);
}
inline void Start()
{

union
{
void(__stdcall *lpfn1)(LPCTSTR);
void(B::*lpfn2)(LPCTSTR);
} _proc;
_proc.lpfn2 = &B::fncallback ;

A a;
a.CallCallBack(_proc.lpfn1,_T("callback string!"));
}
};

绝对没有任何问题
pengzhixi 2011-02-16
  • 打赏
  • 举报
回复
class B;
class A
{
public:
void CallCallBack(void(B::*lpfn)(LPCTSTR),LPCTSTR lpstr,B*ptr);

};

class B
{
public :
inline void fncallback(LPCTSTR lpstr)
{
::MessageBox(NULL,lpstr,NULL,MB_OK);
}
inline void Start()
{

union
{
void(*lpfn1)(LPCTSTR);
void(B::*lpfn2)(LPCTSTR);
} _proc;
_proc.lpfn2 = &B::fncallback ;

A a;
a.CallCallBack(_proc.lpfn2,_T("callback string!"),this);
}
};

void A::CallCallBack(void(B::*lpfn)(LPCTSTR),LPCTSTR lpstr,B*ptr)
{
(ptr->*lpfn)(lpstr);
}

int main()
{
B b;
b.Start();
return 0;
}
whg01 2011-02-16
  • 打赏
  • 举报
回复
要使用类的成员函数指针,并且把B类的指针同时传给A.CallBack,大概是这样:
inline void CallCallBack(B* pB, void(Base::*lpfn)(LPCTSTR),LPCTSTR lpstr)
{
pB->lpfn(lpstr);
}

调用:
a.CallCallBack(this, _proc.lpfn1,_T("callback string!"));
欣客 2011-02-16
  • 打赏
  • 举报
回复
类的成员函数不可以作为回调函数。。。
二楼の五号 2011-02-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pengzhixi 的回复:]
请用静态成员函数。
[/Quote]

谢谢,目的就是不想用静态成员函数。比如说封装一个 Socket类这样
MSOCKET{
public:
bool connect(const char*ip,uint port,int(*onrecv)(const char* buf,int len));
bool close();
} 就OK了。不知道有没表达清楚。
qq120848369 2011-02-16
  • 打赏
  • 举报
回复
可以将void (A::*CALLBACK)(LPCTSTR lpstr)使用union技巧转化成void (*func)(A*,LPCTSTR lpstr)。

不过我认为还是楼上说的那样用static。
pengzhixi 2011-02-16
  • 打赏
  • 举报
回复
请用静态成员函数。

64,639

社区成员

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

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