最近写CPP的时候,需要类外部一个普通函数指针调用类成员函数。根据当初的设计,函数指针所指向的函数不需要传入一个类对象的引用的形参。为了保持最初的设计,在不创建对象的情况下考虑了几种方案:
- 首先想到的是静态成员函数。我们知道相比于普通成员函数,静态成员对象间共享且可以通过类名直接访问,同时普通函数指针必须指向静态成员函数。普通成员函数与静态成员函数区别可以总结于下图。
但是静态成员函数有个使用限制就是不能访问普通成员变量,巧了,刚好回调函数需要使用普通成员变量。KO!!! - 第二个想到的解决方案是通过继承所需要使用的函数所在的类来实现。刚开始觉得可行,仔细一想,这样不就又回到了普通函数指针无法使用类内成员函数的问题上了。Ko!!!
- 第三个想到的是如果普通成员函数指针无法实现回调函数功能的话不如使用指向类对象的函数指针来代替。乍一看挺好,按照这个思路前期的实现也变得很简单,编译器也没有报错。但是,最后发现回调函数并不只是需要调用一个类的成员函数!!!,指向一个类的函数指针完全不够用,生活回到了解放前。。。KO!!
- 第四个想到的解决方案是使用友元函数。哎?听起来不错,没准可行。但是后来具体实现的时候还是要通过传入类对象,才能实现对其成员函数的访问。KO!!!
经过上述方案后要实现所谓的不创建类对象完成对该类成员函数的访问在需要涉及到普通成员变量的访问的情况下是不太可能的。最后还是在友元函数的基础上,并且改变了函数指针的形参(传入一个类对象)完成了正确的调用。针对第三种方案出现的问题,即完成对非传入形参类的成员函数也要实现访问,最终选择让传入形参的类来继承需要访问的另一个类对象。至此完成回调函数的正确调用,功能也得以实现。
从中可以看出代码的前期设计并没有考虑充分,而且对CPP的相关知识掌握还不是很牢靠,最后造成的代码模块本身的缝缝补补,谨记!路漫漫其修远兮!