2007-06-27
函数指针的应用
一、全局或静态函数指针
全局或静态函数指针非常简单,也是最为常见的只要函数实体为全局或静态函数就OK
1、函数指针定义
直接定义
typedef void ( *Function)(char* pStr);
Function m_Function;
2、函数指针负值
直接负值
m_Function = test2;
3、函数指针变量的调用
直接负值
m_Function("调用类中静态函数成功!");
二、类中的函数指针
1、函数指针定义
由于在类中的非静态函数中都存在this指针,所以在定义类中使用的函数指针时要定义其所在类名:
typedef void ( CFunction::*Fun)(char* lp_t);
在原指针函数前加上所在类标志"CFunction::",否则将不认为是类中的指针;
在定义函数指针时只需要使用其指针名即可,不需要指定所属类:
ClassFun m_ClassFun[2];
2、类中的函数指针负值
在vc7.1及以下版本中,于由编译器对编码要求不是很严禁,所以在一般的"类中的函数指针"负值时直接给值即可:
m_ClassFun[0] = test0;
而在vc8版本中,编译器对编码要求比较严格,所以在"类中的函数指针"负值时必须给与制订完整的地址:
m_ClassFun[0] = &CFunction::test0;
3、类中的函数指针变量在类中的调用
由于在类中的非静态函数中都存在this指针,所以在调用类中使用的函数指针时要表现出this指针:
(this->*m_ClassFun[0])("调用类中函数成功!");
/* 代码段 */
/* 全局函数指针定义 */
typedef void ( * Function)( char * pStr);
/* 测试类 */
class CFunction
{
public :
/* 类中函数指针定义 */
typedef void ( CFunction:: * ClassFun)( char * pStr);
public :
ClassFun m_ClassFun[ 2 ]; /* 类中指针函数 */
Function m_Function; /* 全局或静态指针函数 */
public :
CFunction();
~ CFunction(){}
void ClassTest();
void Test();
void test0( char * pStr)
{
printf( " 函数[test0(char* pStr)]->[%s] " ,pStr);
}
void test1( char * pStr)
{
printf( " 函数[test1(char* pStr)]->[%s] " ,pStr);
}
static void test2( char * pStr)
{
printf( " 函数[static test2(char* pStr)]->[%s] " ,pStr);
}
};
/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
CFunction::CFunction()
{
m_ClassFun[ 0 ] = & CFunction::test0;
m_ClassFun[ 1 ] = & CFunction::test1;
m_Function = test2;
}
void CFunction::ClassTest()
{
( this ->* m_ClassFun[ 0 ])( " 调用类中函数成功! " );
}
void CFunction::Test()
{
m_Function( " 调用类中静态函数成功! " );
}
/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
int main()
{
CFunction Function;
/* 执行类中函数指针指向函数 */
Function.ClassTest();
/* 执行全局或静态函数指针指向函数 */
Function.Test();
while ( 1 );
return 0 ;
}