谁能告诉我原因

sleepingdx 2009-08-17 03:56:30
typedef void (*pFn)();

class Test
{
public:
bool handleEvent(pFn pfn)
{
pfn();
return true;
}
static void go()
{
cout << "helloWorld" << endl;
}
};

void main()
{
Test tt;
tt.handleEvent(Test::go);
cin.get();
}

为什么go()必须是static类型的, 才能被注册到handleEvent()中去??????
...全文
44 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sleepingdx 2009-08-17
  • 打赏
  • 举报
回复
明白了 谢谢.
abcdef0966 2009-08-17
  • 打赏
  • 举报
回复
不懂你为啥要这么干
HengStar 2009-08-17
  • 打赏
  • 举报
回复
因为go函数是声名在类里面的,使用类中的非静态函数必须要一个类的实例才行
假设go不是static的,那么要使用它就必须

Test test;
test.go(); // 用test实例去调用它
但是handleEvent函数接收的参数里面只是一个函数指针,而不是成员函数指针,没有要求接收类的实例,所以必须用全局或静态类成员函数作为实参
当然,你可以把
typedef void (*pFn)();
改为
typedef void (Test::*pFn)();
然后就不用声明go为静态的了
sleepingdx 2009-08-17
  • 打赏
  • 举报
回复
首先我说下, 这个代码是对的, 也就是说, 我想用handleEvnet()函数参数填写go函数的话, go()必须是静态的才行, 否则会提示错误. 或许是注册给函数指针的函数必须是全局?
lijian22500 2009-08-17
  • 打赏
  • 举报
回复
pFn 也必须是这向类成员函数的指针
lijian22500 2009-08-17
  • 打赏
  • 举报
回复
typedef void (*pFn)();

class Test
{
public:
bool handleEvent(pFn pfn)
{
pfn();
return true;
}
void go()
{
cout < < "helloWorld" < < endl;
}
};

void main()
{
Test tt;
tt.handleEvent(tt.go);
cin.get();
}

这样不行吗
xxcclowlg 2009-08-17
  • 打赏
  • 举报
回复
静态的是全局?
貌似

64,637

社区成员

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

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