首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

怎么实现通过函数指针“调用”类的成员函数,一个关于类的设计有关问题

2012-02-19 
如何实现通过函数指针“调用”类的成员函数,一个关于类的设计问题有一个类classdemo{fun(){...fun1()...fun

如何实现通过函数指针“调用”类的成员函数,一个关于类的设计问题
有一个类
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 test
{
public :
void fun1() {}
void fun2() {}

void cfun(void (__thiscall test::*f1 )(void), void (__thiscall test::*f2 )(void))
{

}

void fun()
{
cfun(&test::fun1, &test::fun2);
}
};
[解决办法]
成员函数可以类域内自由调用。
[解决办法]
楼上如果我要在CFUN()里用指针调用FUN1和FUN2该怎么调用?

=========

void cfun(void (__thiscall test::*f1 )(void), void (__thiscall test::*f2 )(void))
{
(this-> *f1)(); //像这样啊

}
[解决办法]
primer C++里说得很清楚:函数指针有成员函数指针和非成员函数指针.
调用类成员函数的是成员函数指针,它多个所在类的类型作为参数
[解决办法]
用类模板就可以,类的函数做成静态的.
具体怎么写不提供,自己查资料.

热点排行