怎么实现通过函数指针“调用”类的成员函数,一个关于类的设计有关问题
如何实现通过函数指针“调用”类的成员函数,一个关于类的设计问题
有一个类
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函数,但是不是太安全,理论上他只是函数中实现代码,而不是一个真正的函数。
还有没有更好的实现方案呢?
------解决方案--------------------
用指向成员的指针。
------解决方案--------------------
可以这样
comm_fun(demo* obj,void (* pfun1)(), void (* pfun2)())
{
...
obj-> *pfun1();
...
obj-> *pfun2()
}
------解决方案--------------------
或者用静态成员函数- -
------解决方案--------------------
使用指向类的成员函数的指针,
如:
class A
{
public:
void fun1();
};
void A::fun1()
{
}
使用时:
void (A::*p)()=A::fun1; //p指向了类的成员函数fun1
调用时必须用对象或指向对象的指针来调用
如:
A a;
a.p(); //调用a.fun1()
按这个思路试试能不能完成你的想法吧
------解决方案--------------------
楼上为正解,不过这对于函数本身的类型会有限制,不能实现绝对意义上的通用。
------解决方案--------------------
所有的编译器,都提供了符合C++标准明确要求的行为的类成员函数指针,没有兼容性问题。
有一个类
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函数,但是不是太安全,理论上他只是函数中实现代码,而不是一个真正的函数。
还有没有更好的实现方案呢?
------解决方案--------------------
用指向成员的指针。
------解决方案--------------------
可以这样
comm_fun(demo* obj,void (* pfun1)(), void (* pfun2)())
{
...
obj-> *pfun1();
...
obj-> *pfun2()
}
------解决方案--------------------
或者用静态成员函数- -
------解决方案--------------------
使用指向类的成员函数的指针,
如:
class A
{
public:
void fun1();
};
void A::fun1()
{
}
使用时:
void (A::*p)()=A::fun1; //p指向了类的成员函数fun1
调用时必须用对象或指向对象的指针来调用
如:
A a;
a.p(); //调用a.fun1()
按这个思路试试能不能完成你的想法吧
------解决方案--------------------
楼上为正解,不过这对于函数本身的类型会有限制,不能实现绝对意义上的通用。
------解决方案--------------------
所有的编译器,都提供了符合C++标准明确要求的行为的类成员函数指针,没有兼容性问题。