C++通过函数指针调用类的私有方法

匿名 (未验证) 提交于 2019-12-03 00:03:02

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

解决办法有两个:

  1. 把非静态的成员方法改成静态的成员方法
  2. 正确的使用类成员函数指针(在下面介绍)

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++ 类成员函数的函数指针
恼人的函数指针(二):指向类成员的指针

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!