在C++中定义类成员函数指针

本文介绍了如何定义指向类成员函数的指针类型,并提供了具体的示例代码。通过定义特定类型的指针,可以灵活地调用不同的类成员函数。

转载自:http://www.cppblog.com/shaker/archive/2006/09/01/11924.html

一般的函数指针定义是这样的:

/*****************code begin*****************/
typedef return_type (*fFunctionPoint) ( ... );
/*****************code end******************/

类成员函数是不能被转化成类似上例中的fFunctionPoint类型的.
定义指向类成员函数的指针类型,如下:

/*****************code begin*****************/
typedef
return_type (class_name::*fMemberFunctionPoint) ( ... );
/*****************code end******************/

调用的时候使用

/*****************code begin*****************/
class_name
* Object;
fMemberFunctionPoint MemberFunc;
((*Object).*(MemberFunc))( ... );
/*****************code end******************/

<think>嗯,用户问的是如何在C++定义和使用函数指针。首先,我需要回忆一下C++函数指针的基本知识。函数指针是指向函数的指针变量,可以存储函数的地址,方便回调或者动态调用。不过在里面使用的话,可能会有一些不同的地方,特别是成员函数指针和普通函数指针的区别。 根据用户提供的引用,比如引用[1]提到,成员函数指针需要的作用域,所以普通的函数指针定义方式可能不适用。引用[3]还提到,如果要在中使用另一个的成员函数指针,可能需要静态成员函数,因为非静态成员函数有隐含的this指针,导致型不匹配。所以这可能是一个关键点。 首先,用户的问题分为两部分:定义和使用。在定义函数指针,可能需要使用typedef或者using来简化型声明。例如,在内部定义一个成员函数指针型,比如typedef float (Point::*MemberFunc)(); 这样的话,这个型可以指向Point的成员函数,比如x()和y()。 接下来,用户可能需要知道如何初始化这个指针,并调用它。比如,创建一个成员函数指针变量,如MemberFunc ptr = &Point::x;,然后通过对象来调用,比如(origin.*ptr)();或者对于指针对象,(ptr->*ptr)();。 另外,用户提供的引用[2]中提到了函数指针数组的定义和初始化,这在中也是可能的。例如,在Test定义了一个函数指针数组funcPtr,存储静态成员函数的指针,因为非静态成员函数需要对象实例,而静态函数没有this指针,可以直接使用。 还需要注意权限问题,比如在定义函数指针如果是private的话,外部不能直接访问,需要通过公共方法进行设置或调用。此外,成员函数指针和普通函数指针的语法不同,需要使用名::*来声明,并且在调用时需要结合对象实例。 可能用户还会遇到问题,比如为什么不能直接使用非静态成员函数作为函数指针,这时候需要解释this指针的存在导致参数不匹配,必须使用静态成员函数或者通过对象实例来绑定。 总结一下,步骤应该是:1. 在内部定义成员函数指针型;2. 声明该型的变量;3. 初始化为特定的成员函数;4. 通过对象实例调用。同时,如果需要跨使用,可能需要静态成员函数或者适配器模式来处理this指针的问题。</think>在C++定义和使用函数指针需要特别注意成员函数的特殊性和作用域限制。以下是具体实现步骤及示例: ### 一、定义成员函数指针 1. **使用`typedef`或`using`定义型** ```cpp class Calculator { public: // 定义成员函数指针型 typedef int (Calculator::*Operation)(int, int); int add(int a, int b) { return a + b; } int sub(int a, int b) { return a - b; } }; ``` 2. **声明并初始化函数指针** ```cpp Calculator calc; Calculator::Operation op = &Calculator::add; // 指向add函数 ``` ### 二、跨使用函数指针 当需要指向其他的成员函数时,需满足以下条件: ```cpp class B { public: static int multiply(int a, int b) { // 必须是静态成员函数 return a * b; } }; class A { public: typedef int (*ExternalFunc)(int, int); // 普通函数指针型 void execute(ExternalFunc f, int x, int y) { cout << f(x, y) << endl; } }; // 使用示例 A a; a.execute(B::multiply, 5, 6); // 输出30 ``` ### 三、函数指针数组实现 ```cpp class MathOperations { public: typedef int (*StaticOp)(int, int); // 静态函数指针型 static int add(int a, int b) { return a + b; } static int sub(int a, int b) { return a - b; } // 定义并初始化函数指针数组 StaticOp operations[2] = {add, sub}; }; // 调用方式 cout << MathOperations::operations[0](10, 5); // 输出15 ``` ### 四、注意事项 1. 成员函数指针必须通过对象调用:`(obj.*func_ptr)()` 2. 非静态成员函数指针需携带this指针[^3] 3. 跨调用时推荐使用静态成员函数避免作用域冲突[^3] 4. 函数指针数组元素型必须完全一致[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值