关于类的静态成员函数指针的问题
2017-05-03 22:17
351 查看
最近遇到了这个问题,也查找了好多资料,特此总结一下。
http://www.cnblogs.com/xianyunhe/archive/2011/11/26/2264709.html
所谓函数指针,就是指向函数的指针,可以以此来间接调用函数。但是呢,指向一般函数和指向类的成员函数不太一样,而成员函数是否是静态的,又有点不一样。下面通过代码来说明:
1.指向一般函数的指针
typedef int (*pFun)(int, int); int Max(int a, int b) { return a > b ? a : b; } int Min(int a, int b) { return a < b ? a : b; } int Result(pFun fun, int a, int b) { return (*fun)(a, b); } void main() { int a = 3; int b = 4; cout<<Result(Max, a, b)<<endl; cout<<Result(Min, a, b)<<endl; }
这里的结果为4,3。
这里用到了typedef,需要额外解释一下啊。这里是定义了一个返回值为int,两个int类型参数的函数指针pFun。如果有多个同类型的函数(返回类型为int,参数为两个int),通过这个函数指针可以指向不同条件下的函数,便于统一处理。接下来,如果声明如pFun fun就等于 int (*fun)(int x,int y) ,pFun成为了一种类型 可以定义出这种类型的多个函数。
2.指向类成员函数的指针
下面是一个指向类的成员函数的指针的使用的例子,包括指向静态和非静态成员函数的指针的使用。
class CA; typedef int (CA::*pClassFun)(int, int); typedef int (*pGeneralFun)(int, int); class CA { public: int Max(int a, int b) { return a > b ? a : b; } int Min(int a, int b) { return a < b ? a : b; } static int Sum(int a, int b) { return a + b; } /*类内部的接口函数,实现对类的非静态成员函数的封装*/ int Result(pClassFun fun, int a, int b) { return (this->*fun)(a, b); } }; /*类外部的接口函数,实现对类的非静态成员函数的封装*/ int Result(CA* pA, pClassFun fun, int a, int b) { return (pA->*fun)(a, b); } /*类外部的接口函数,实现对类的静态成员函数的封装*/ int GeneralResult(pGeneralFun fun, int a, int b) { return (*fun)(a, b); } void main() { CA ca; int a = 3; int b = 4; cout<<ca.Result(CA::Max, a, b)<<endl; cout<<ca.Result(CA::Min, a, b)<<endl; cout<<endl; cout<<Result(&ca, CA::Max, a, b)<<endl; cout<<Result(&ca, CA::Min, a, b)<<endl; cout<<endl; cout<<GeneralResult(CA::Sum, a, b)<<endl; }
如果我们不用上面的typedef,直接用函数指针,精简代码,如下:
class CA { public: static int Sum(int a, int b) { return a + b; } }; int SUMXSUM(int (*pFun)(int,int), int a, int b) { return (*pFun)(a, b) *(*pFun)(a, b); } int main() { //CA ca; int a = 3; int b = 4; int (*pFun)(int, int); pFun = &CA::Sum; cout << pFun(a, b) << endl; cout << SUMXSUM(pFun, a, b) << endl; }
这个函数指针还可以作为另一个函数的参数。
相关文章推荐
- 关于C++中类的成员函数指针相关问题
- 关于C++静态成员函数访问非静态成员变量的问题
- 关于类成员函数指针的调用问题
- 巧妙解决问题:&CMFCcodeDlg::RunCommands”创建指向成员的指针。MFC多线程调用要求调用的接口必须是全局函数或静态成员函数
- C++关于this指针、静态变量和静态成员函数
- 关于C++静态成员函数访问非静态成员变量的问题
- 关于c++中类静态成员函数可能破坏类封装性的问题
- 遇到一个关于静态成员函数的问题
- 关于空指针类型的类变量的成员函数访问的问题
- C++关于this指针、静态变量和静态成员函数 http://www.cnblogs.com/clrmas/archive/2010/03/23/1692893.htm
- 关于指针函数和函数指针的问题(一)
- 成员函数指针,静态成员函数指针,友元函数指针
- 对于静态成员指针的出现的问题
- 关于空指针调用类成员能否通过的问题
- 函数的返回值问题(返回指针和数组的区别)静态存储区、动态数据区、栈
- 关于静态成员函数的一些认识
- 关于函数字符数组调用的问题(没有搞清指针的概念)
- 关于类成员函数指针
- 【转】C++编程中用指针直接调用类成员函数问题及其解决方法
- 关于c++ 函数指针的问题