免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1463 | 回复: 2
打印 上一主题 下一主题

[函数] 静态成员函数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-03-08 10:35 |只看该作者 |倒序浏览
这个问题是很古老的问题了,不过万万没有想到,昨天我居然在这里翻船了!!!

今天写出来,大家一起复习下

问题描述:

有类Class A
{
   int fun();
}
在消息处理机制种遇到如下情况:
消息影射列表中
{Message,fun}
编译无法通过
解决方法如下:
修改函数声明
有类Class A
{
  static  int fun();
}
编译通过

结论如果其他函数需要使用fun函数,需要将函数生命为static。static为静态函数,函数归类所有,拥有固定地址,可以通过  void (*) ()  调用。若非静态函数,则函数归对象所有,在对象被定义以前,地址未知,固无法通过void (*) ()  调用。

论坛徽章:
0
2 [报告]
发表于 2006-03-08 12:16 |只看该作者
不一定这样,非静态的成员函数也可以在类以外被调用,但是这个类一定要先实例化.
一个例子:
//~Wrapper.h
class Wrapper  
{
public:
typedef void (Wrapper::* FunPtr)(void*, void*);
private:
FunPtr getPtr;
public:
FunPtr getExport();
void Fun(void* p1, void* p2);
Wrapper();
virtual ~Wrapper();

};
//~Wrapper.cpp
Wrapper::Wrapper()
{
getPtr = this->Fun;
}
Wrapper::~Wrapper()
{
}
void Wrapper::Fun(void *p1, void *p2)
{
printf("In Wrapper::Fun\n");
}
Wrapper::FunPtr Wrapper::getExport()
{
return getPtr;
}
然后是管理这个公用接口的管理类:
//~Manager.h
template <class wrapper>
class Manager  
{
typedef wrapper::FunPtr FunPtr;
FunPtr ptr;
wrapper ins;
public:
Manager();
virtual ~Manager();
void run();
};
template <class wrapper>
Manager<wrapper>::Manager()
{
}
template <class wrapper>
Manager<wrapper>::~Manager()
{
}
template <class wrapper>
void Manager<wrapper>::run()
{
ptr = ins.getExport();
(ins.*ptr)(NULL, NULL);
}
使用过程:
Manager<Wrapper> TestObj;
TestObj.run();

论坛徽章:
0
3 [报告]
发表于 2006-03-08 12:36 |只看该作者
实例化后,已经有固定地址了,自然可以调用
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP