普通函数指针和指向类成员函数的指针
时间:2014-03-18 11:33 来源: 我爱IT技术网 作者:山风
看同事写的一个服务器的框架,里面有个地方很奇怪,之前很少见,后来弄明白了这个是指向类成员函数的指针的用法,具体如下:
typedef void (ICmdTarget::*TARGET_CALL)(void);
这行代码的具体意义是:定义一个函数指针类型TARGET_CALL ,以后可以用TARGET_CALL 这个类型定义变量,例如
TARGET_CALL fun;
意思是fun是一个函数指针,它指向类ICmdTarget的某个成员函数 。
关于普通函数指针和指向类成员函数的指针的区别,详细代码如下:
#include#include /// 定义一个简单的计算器类 class CCalculate { public: /// 构造函数 CCalculate() { m_a = 0; m_b = 0; } /// 析构函数 ~CCalculate(){}; public: /// 设置成员变量的值 /// @param a: 设置成员变量m_a的值 /// @param b: 设置成员变量m_b的值 /// @ retval: void, 无返回值 void set_val(const int a, const int b) { m_a = a; m_b = b; } /// 加法 /// @param void 没有参数 /// @retval 两个成员变量的和 int add() { return m_a + m_b; } /// 减法 /// @param void 没有参数 /// @retval 两个成员变量的差 int sub() { return m_a - m_b; } /// 乘法 /// @param void 没有参数 /// @retval 两个成员变量的积 int mul() { return m_a * m_b; } /// 除法 /// @param void 没有参数 /// @retval = -1 错误,除数不能为0 /// @retval >= 0 正常情况,返回两个成员变量的商 int div() { if(m_b == 0) { return -1; } return m_a / m_b; } private: int m_a; /// 第一个成员变量,假设 > 0 int m_b; /// 第二个成员变量,假设 > 0 }; /// 全局加法函数定义 /// @param a: 第一个加数 /// @param b: 第二个加数 /// @retval: 返回两个参数的和 int global_add(const int a, const int b) { return a + b; } /// 定义指向类成员函数的指针类型 CFun typedef int (CCalculate::*CFun)(); /// 定义指向全局函数的指针类型 global_pfun typedef int (*global_pfun)(int a, int b); int main() { printf("hello world\n"); CFun pFun = &CCalculate::add; CCalculate obj; obj.set_val(25, 5); int res = 0; int res_void = 0; res = (obj.*pFun)(); res_void = (obj.*pFun)(); printf("add result=%d, result_void=%d\n", res, res_void); //pFun(); pFun = &CCalculate::sub; res = (obj.*pFun)(); printf("sub result=%d\n", res); pFun = &CCalculate::mul; res = (obj.*pFun)(); printf("mul result=%d\n", res); pFun = &CCalculate::div; res = (obj.*pFun)(); printf("div result=%d\n", res); global_pfun g_pfun = global_add; res = (*g_pfun)(4, 5); printf("global function pointer result=%d\n", res); return 0; }
程序在vs2005下面可以运行:ctrl + f7 ---> f7 ---> ctrl + f5, 就可以看到运行结果了,可以看到,指向类成员函数的函数指针必须
通过类的对象用点号来调用;指向全局函数的指针则需要用小括号括起来,后面跟小括号和参数列表,这种方式调用@@
本文来源 我爱IT技术网 http://www.52ij.com/jishu/4167.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
