类的成员函数指针作为参数传递给其他函数和普通函数指针的传递是不同的
来源:互联网 发布:唯品会 淘宝客 编辑:程序博客网 时间:2024/04/30 05:46
类的成员函数指针作为参数传递给其他函数和普通函数指针的传递是不同的,普通函数指针的传递
只要在参数声明中声明是相同参数个数、类型和相同返回类型的函数指针int (*p)(int),传递时只需传函数名就可以了.
可是传递成员函数指针用此方法却不能工作。指针是指向一些内存地址的变量,既可以是数据的地址也可以是函数的地址。C++的 成员指针遵从同样的原则。但在类内部没有地址;选择一个类的成员意味着在类中偏移。只有把这个偏移和具体对象的开始地址结合,才能得到实际地址。成员指针的语法要求选择一个对象的同时逆向引用成员指针。
先来看看一个错误的例子:
//---------------------------------------------------------------------------
class A
{
public:
int fun1(int i){return i;};
};
void fun2(int j, int (A::*p)(int)){
cout <<p(j);
}
void main()
{
A oba;
int i=1;
fun2(i,oba.fun1); //this is an error
}
//---------------------------------------------------------------------------
为了能够正确地传递成员函数指针,我们先来看看成员参数、成员函数指针正确的声明方法:
//---------------------------------------------------------------------------
class A
{
public:
int i1;
int fun1(int i){
return i;
};
};
void main()
{
int (A::*fp1)(int); //声明fp1为class A中的成员函数指针
int A::*ip1; //声明ip1为class A中的成员变量指针
fp1=&A::fun1; //初始化fp1
ip1=&A::i1; //初始化ip1
A oba;
oba.*ip1=2;
(oba.*fp1)(oba.*ip1);
}
//---------------------------------------------------------------------------
以下为正确传递成员函数指针的例子:
//---------------------------------------------------------------------------
class A
{
public:
int fun1(int i){
return i;
};
};
template <class T>
void fun2(int j, T *obp, int (T::*p)(int)){
cout <<(obp->*p)(j);
}
void main()
{
int (A::*fp1)(int);//声明fp1为class A中的成员函数指针
fp1=&A::fun1; //初始化fp1
A oba;
A *obap=&oba;
int i=1;
fun2(i,obap,fp1);
}
//---------------------------------------------------------------------------
当然,可以把成员函数声明为static(静态函数),这样传递它的指针就像传递普通函数一样。但是又涉及一个问题:类中如何在static 函数中调用 非static 函数 。
方法:使用静态成员函数
使回调成员函数为静态。因为静态成员函数不带隐含式参数“this”。因此,可以将其参数中的地址当作是普通函数的指针来使用。如果要从静态成员函数中访问对象的数据成员,显式传入对象的地址即可。例如:
//---------------------------------------------------------------------------
class Hack
{
private:
int x;
public:
int get_x();// 非静态成员函数
static void func(Hack * pthis); // 静态成员函数
void func2(); // 非静态成员函数
};
void Hack::func(Hack * pthis)
{
int y = pthis->get_x(); // 访问对象的数据成员
}
//---------------------------------------------------------------------------
- 类的成员函数指针作为参数传递给其他函数和普通函数指针的传递是不同的
- 类的成员函数指针作为参数传递给其他函数和普通函数指针的传递是不同的
- 成员函数指针作为参数传递给其他函数和普通函数指针的传递
- 向普通函数传递类成员函数指针的问题
- 向普通函数传递类成员函数指针的问题
- 指针作为函数参数传递的问题
- 函数指针作为参数传递给函数
- 如何传递类成员函数的指针
- 关于指针作为函数参数传递的理解,对比普通变量作为函数参数的需注意点,其实就是行参和实参的问题。
- 指针作为函数的参数传递的问题
- 指针作为函数的参数传递的问题
- 指针作为函数的参数传递的问题
- 指针作为函数的参数传递的问题
- 指针作为函数参数传递
- 指针作为函数参数传递
- 指针作为函数参数传递
- 指针作为函数参数传递
- 指针作为函数参数传递
- HDU - 4734 F(x) (2013成都网络赛,数位DP)
- 一---c语言基础
- Python yield 使用浅析
- 关于android sdk manager速度慢的问题
- 数据库设计三大范式
- 类的成员函数指针作为参数传递给其他函数和普通函数指针的传递是不同的
- ubuntu下使用ccmake和cmake版本工具实践
- IE 控件调试本地网页
- IO系统性能之二:缓存和RAID如何提高磁盘IO性能
- 第五十二题(二元树的深度)
- [Python]Windows下python环境变量配置
- 大整数模板(c++)—算法竞赛入门
- 线程的同步synchronized
- MFC+openCV学习