关于函数指针做形参的有关问题
关于函数指针做形参的问题
int a(int x,int y)
{
return (x> y)?x:y;
}
int b(int x,int y,int (*z)(int,int))
{
return z(x,y);
}
使用的使用用b(1,2,&a)是可行的,但是当a属于1个类的私有变量而在该类中使用b(1,2,&a)就会报错
error C2276: '& ' : illegal operation on bound member function expression
而函数a中要使用该类中另外的私有变量,并不能将其移动到类外。
请问该怎么解决?
------解决方案--------------------
因为类成员函数(非静态)都有一个隐藏的this指针。
用模板吧
class teset
{
int a(int x,int y)
{
return (x> y)?x:y;
}
};
template <class T>
int b(int x,int y,T func)
{
return func(x,y);
}
int main()
{
test x;
b(1,2,bind1st(mem_fun(&test::a),&x) );
}
------解决方案--------------------
用thunk技术,使用成员函数做回调
------解决方案--------------------
没有必要,直接调用之。
------解决方案--------------------
假如你的类为CClass1;
最简单的解决办法:
在类中声明函数为
Static int a(int x,int y,CClass1 *pThis)
int a(int x,int y,CClass1 *pThis)
{
.....
return (x> y)?x:y;
}
int b(int x,int y,int (*z)(int,int,CClass1 *pThis ))
{
return z(x,y);
}
就可以了。
------解决方案--------------------
LZ题目问的就有问题,既然要调用类的成员函数,怎么又不指明是哪个对象?
如果根本就不需要指明是哪个对象,那么就设为static的成员函数好了。
如果需要指明哪个对象,势必需要改动当前的设计,如果a、b的函数形式都不能变动的话,
声明一个static int classtype::s_a(int x,int y);
当前需要调用的是哪个对象,你必须要通过x或者y这个参数告知classtype::s_a,可以使用struct的指针形式作参数,比如定义一个
struct xxx
{
int x;
classtype* p;
} xx;
然后这样调用:
xx.x = 1;
xx.p = 要访问的对象指针;
b((int)&xx,2,classtype::s_a);
而s_a可以这样写:
static int classtype::s_a(int x,int y)
{
struct xxx *pxx = (struct xxx *)x; //警告无视
pxx-> p-> a(pxx-> x,y); //a就是你原先要处理的回调函数
}
int a(int x,int y)
{
return (x> y)?x:y;
}
int b(int x,int y,int (*z)(int,int))
{
return z(x,y);
}
使用的使用用b(1,2,&a)是可行的,但是当a属于1个类的私有变量而在该类中使用b(1,2,&a)就会报错
error C2276: '& ' : illegal operation on bound member function expression
而函数a中要使用该类中另外的私有变量,并不能将其移动到类外。
请问该怎么解决?
------解决方案--------------------
因为类成员函数(非静态)都有一个隐藏的this指针。
用模板吧
class teset
{
int a(int x,int y)
{
return (x> y)?x:y;
}
};
template <class T>
int b(int x,int y,T func)
{
return func(x,y);
}
int main()
{
test x;
b(1,2,bind1st(mem_fun(&test::a),&x) );
}
------解决方案--------------------
用thunk技术,使用成员函数做回调
------解决方案--------------------
没有必要,直接调用之。
------解决方案--------------------
假如你的类为CClass1;
最简单的解决办法:
在类中声明函数为
Static int a(int x,int y,CClass1 *pThis)
int a(int x,int y,CClass1 *pThis)
{
.....
return (x> y)?x:y;
}
int b(int x,int y,int (*z)(int,int,CClass1 *pThis ))
{
return z(x,y);
}
就可以了。
------解决方案--------------------
LZ题目问的就有问题,既然要调用类的成员函数,怎么又不指明是哪个对象?
如果根本就不需要指明是哪个对象,那么就设为static的成员函数好了。
如果需要指明哪个对象,势必需要改动当前的设计,如果a、b的函数形式都不能变动的话,
声明一个static int classtype::s_a(int x,int y);
当前需要调用的是哪个对象,你必须要通过x或者y这个参数告知classtype::s_a,可以使用struct的指针形式作参数,比如定义一个
struct xxx
{
int x;
classtype* p;
} xx;
然后这样调用:
xx.x = 1;
xx.p = 要访问的对象指针;
b((int)&xx,2,classtype::s_a);
而s_a可以这样写:
static int classtype::s_a(int x,int y)
{
struct xxx *pxx = (struct xxx *)x; //警告无视
pxx-> p-> a(pxx-> x,y); //a就是你原先要处理的回调函数
}