1 前言
今天突发奇想,能否通过函数指针调用类的私有方法。即将私有方法的指针通过公有方法传出来,实现在类外调用类的私有方法。但是实现过程还是一波三折,将过程记录下来,防止踩坑。
2 实现
2.1 C中的方法
在C语言中,我们可以使用如下方式来获取函数指针,并返回:
typedef void (*Func)(); void func1() { std::cout << "hello world" << endl; } Func getFunc() { return func1; }
但是当我们在 C++ 中直接像 C 那样使用类的成员函数指针时,通常会报错,提示你不能使用非静态的函数指针:
reference to non-static member function must be called
解决办法有两个:
- 把非静态的成员方法改成静态的成员方法
- 正确的使用类成员函数指针(在下面介绍)
2.2 C++中访问成员函数指针
将函数改为静态函数很简单, 只需在函数声明前加上static
关键字即可。
但是C++中类成员函数指针的引用方式需要一些技巧:
声明:与普通函数作为区分,指向类的成员函数的指针只需要在指针前加上类类型即可,格式为:
typedef 返回值 (类名::*指针类型名)(参数列表);
需要注意的是指针符号 * 必须写在指针类型名的前面,不要写在类名的前面。
赋值:只需要用类的成员函数地址赋值即可,格式为:
指针类型名 指针名 = &类名::成员函数名;
此处需要注意必须写上 类名 和 取址符号&
调用:调用方法也很简单,针对调用的对象是对象还是指针,分别用.*
和->*
进行调用,格式为:
类对象
(类对象.*指针名)(参数列表);
类指针
(类指针->*指针名)(参数列表);
2.3 看代码
class Test; //声明函数类型 typedef void (Test::* Func1)(); class Test { public: Test() {}; ~Test() {}; //返回函数指针 Func1 getFunc1() { return &Test::func1; } //类外声明的函数类型,只能返回类中的 “静态” 函数 Func getFunc() { return func; }; private: //静态函数 static void func() { std::cout << "hello world! func2" << endl; } void func1() { std::cout << "hello world! func3" << endl; } }; int main() { Test test; Func func = test.getFunc(); func(); Func1 func1 = test.getFunc1(); //必须用括号将前面括起来, 因为()的运算符优先级高于解地址运算符* (test.*func1)(); return 0; }
注:本文创作过程中参考了如下两篇博客,如果你对函数指针等概念比较模糊, 相信看完一定会更有收获。
C++ 类成员函数的函数指针
恼人的函数指针(二):指向类成员的指针
来源:51CTO
作者:flist
链接:https://blog.csdn.net/baidu_33850454/article/details/100778368