请教:如何把一个类的成员函数作为回调参数?
例如:
WNDPROC oldproc=&classm::funcm;
gcc编译报错:
converting from `LRESULT (classm::*)(HWND__*,
unsigned int, unsigned int, long int)' to `LRESULT (*)(HWND__*, unsigned
int, unsigned int, long int)'
问题点数:100、回复次数:12Top
1 楼assiss(assiss)回复于 2004-05-04 14:16:44 得分 0
一旦能上网,问题就得到解决了。
这么快啊。
谁先进来这100分白给他了。Top
2 楼cngdzhang()回复于 2004-05-04 14:21:58 得分 10
不能的
类的成员函数取的地址是不确定的
Top
3 楼cngdzhang()回复于 2004-05-04 14:24:09 得分 0
只能是一个全局函数 带CALLBACK类型的
全局函数的地址是确定的Top
4 楼blizzard2000()回复于 2004-05-04 14:25:38 得分 10
定义成静态函数看可否?Top
5 楼chenqing1128(Alex)回复于 2004-05-04 14:26:25 得分 10
学习Top
6 楼blizzard2000()回复于 2004-05-04 14:29:06 得分 10
to cngdzhang
静态函数的地址也是确定的Top
7 楼cngdzhang()回复于 2004-05-04 14:42:36 得分 15
静态函数的地址是确定的
但是取地址的时候
要加上类名
例如
class A
{
public :
static void f(){}
}
用的时候是
A::f()
如果用作回调函数,编译器会报错的
我看了好多程序(EnumChildWindow等API函数,Hook),它们的回调函数都是全局的
Top
8 楼flyingxu(阿飞)回复于 2004-05-04 14:49:01 得分 10
怎么理解类的成员函数地址是不确定的,而静态、全局函数的地址是确定的?Top
9 楼blizzard2000()回复于 2004-05-04 15:17:53 得分 10
to cngdzhang
你用的什么编译器?我怀疑这个跟编译器有关。(纯属猜测)
Top
10 楼assiss(assiss)回复于 2004-05-04 15:20:51 得分 0
定义成static的确可以,
但是新的问题又有了。呵呵。
所以准备放弃掉用类成员函数,
直接使用全局函数吧。
下午结帖(我们这里网络基本瘫痪了,没想到大家都还是通顺的。羡慕啊。)Top
11 楼ghlpj(guolingho)回复于 2004-05-04 15:47:00 得分 10
好象C++对象模型里说过Class::Func实际上是取的相对于this的偏移量,回去验证一下
Top
12 楼cngdzhang()回复于 2004-05-04 15:55:08 得分 15
因为c++要支持多态
一个函数同一个名字可以有好几个实现的
void print(char *s)
void print(string s)
这个取不了地址了把?
而且c++还有运行时的动态绑定
Top




