非静态成员函数指针能做其他函数的参数吗
用g++和vc编译都不行,在调用g()时将x::f强制类型转换也不行,但在声明x::f()时加上static就可以。这是为什么,还有其他解决的方法吗?源代码如下:
#include <iostream>
using namespace std;
class x{
public:
void f();
};
void x::f()
{
cout << "hello" << endl;
}
void g(void(*p)())
{
p();
}
int main()
{
x x1;
g(x1.f);<--调用不允许
return 0;
}
问题点数:20、回复次数:6Top
1 楼sankt(宠辱不惊,看庭前花开花落;去留无意,望天空云卷云舒.)回复于 2006-03-11 11:16:23 得分 10
#include <iostream>
using namespace std;
class x
{
public:
void f();
};
void x::f()
{
cout << "hello" << endl;
}
x x1;
void g( void (x::*p)() )
{
(x1.*p)();
}
int main()
{
g(&x::f);
system("pause");
return 0;
}
Top
2 楼SEUU(三枝花)回复于 2006-03-11 11:24:29 得分 0
不太清楚,可能静态的,全局函数有分配了,地址确定才可以调用吧.
还有,我是来得分,我只要星星.Top
3 楼howyougen(夫孝,德之本也,教之所由生也)回复于 2006-03-11 15:39:59 得分 5
哪有这么用的,
非静态函数3个务必
1。定义必须有类
2。赋值必须有类
3。调用必须通过对象
Top
4 楼discory(discory)回复于 2006-03-11 16:38:03 得分 0
那楼主的程序不满足哪一个条件?Top
5 楼ugg(逸学堂(exuetang.net))回复于 2006-03-11 16:50:56 得分 5
其实lz定义的是个回掉(callback)函数,
类内函数如果想成为callback函数,必须把这个函数声明为static类型。
g(&x::f);// x::f函数调用形式只能出现在类内,或者它的子类内。在外部是
不允许通过x::f方式访问类的成员函数(除非是static函数)
Top
6 楼jet8(jet8)回复于 2006-03-11 22:17:38 得分 0
我现在明白其中的道理了:非静态成员函数在调用之前,编译系统会插入一个this指针作为函数的参数,但如果将该函数作为回调函数的话,则在调用的时候无法为其插入this指针,函数也就不能正确的工作了。我的程序中,回调函数需要访问类中的成员变量,所以我没有使用静态函数而是使用友元函数。现在问题已经解决,谢谢大家的讨论。Top




