如何实现通过函数指针“调用”类的成员函数,一个关于类的设计问题
有一个类
class demo
{
fun()
{
...
fun1();
...
fun2();
...
}
fun1()
{
...
fun11();
...
fun12();
...
}
fun2()
{
...
fun21();
...
fun22();
...
}
fun11();
fun12();
fun21();
fun22();
};
函数fun, fun1, fun2中的代码除了调用子函数那行以外,全部一样。
于是我想能否用一个统一的通用函数代替其中的代码,用函数指针作为参数,大概如下
demo::comm_fun(void (* pfun1)(void), void (* pfun2)(void))
{
...
pfun1();
...
pfun2();
...
}
则fun修改为
demo::fun()
{
comm_fun(fun1, fun2);
}
可惜的是类的成员函数不能使用函数指针传递,那么如果想实现类似的功能,该如何做?
第一种方案:使用helper函数
我的一个办法是给每一个子函数加入一个helper函数,如对应成员函数fun1, fun2,则有普通函数
fun1(demo * d)
{
d->fun2();
}
fun2(demo * d)
{
d->fun2();
}
comm_fun修改为
demo::comm_fun(void (* pfun1)(demo * d), void (* pfun2)(demo * d))
{
...
pfun1(this);
...
pfun2(this);
...
}
fun修改为
demo::fun()
{
comm_fun(::fun1, ::fun2); //注意调用的是helper,而不是成员函数
}
这个方法虽然能够达到要求,但是每个需要用函数指针传递的成员函数,都需要有个对应的helper,实现起来有些麻烦。
第二种方案:使用宏
写一个宏
#define comm_fun(pfun1, pfun2)
...\
pfun1(this);\
...\
pfun2(this);\
...
这样就避免了使用helper函数,但是不是太安全,理论上他只是函数中实现代码,而不是一个真正的函数。
还有没有更好的实现方案呢?