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

cppbird 2007-07-09 01:42:52
有一个类
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函数,但是不是太安全,理论上他只是函数中实现代码,而不是一个真正的函数。

还有没有更好的实现方案呢?
...全文
371 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
cppbird 2007-07-13
  • 打赏
  • 举报
回复
看了楼上各位的方案,最简单的还是成员函数指针
我的方案如下:
typedef void (demo::*pmemfun)()
demo::comm_fun(pmemfun pfun1, pmemfun pfun2)
{
...
this->pfun1();
...
this->pfun2();
...
}

fun修改为
demo::fun()
{
comm_fun(&demo::fun1, &demo::fun2);
}
cunsh 2007-07-10
  • 打赏
  • 举报
回复
楼上如果我要在CFUN()里用指针调用FUN1和FUN2该怎么调用?

=========

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

}
ghost34 2007-07-10
  • 打赏
  • 举报
回复
成员函数可以类域内自由调用。
jaleson 2007-07-10
  • 打赏
  • 举报
回复
用类模板就可以,类的函数做成静态的.
具体怎么写不提供,自己查资料.
yyr2006 2007-07-10
  • 打赏
  • 举报
回复
primer C++里说得很清楚:函数指针有成员函数指针和非成员函数指针.
调用类成员函数的是成员函数指针,它多个所在类的类型作为参数
szwx855 2007-07-10
  • 打赏
  • 举报
回复
楼上如果我要在CFUN()里用指针调用FUN1和FUN2该怎么调用?
星羽 2007-07-10
  • 打赏
  • 举报
回复
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);
}
};
  • 打赏
  • 举报
回复
类成员指针都是一样的,只要你代码写的对,就没问题.
要是还有不兼容问题那就是编译器的问题了.
taodm 2007-07-10
  • 打赏
  • 举报
回复
所有的编译器,都提供了符合C++标准明确要求的行为的类成员函数指针,没有兼容性问题。
除非你是恶意使用类成员函数指针
cppbird 2007-07-10
  • 打赏
  • 举报
回复
我昨天研究了一下,用类成员函数指针确实可以达到要求,但是好象各大编译器厂商的实现并不是完全一样的。可能会有兼容问题。还有没有其它一些通用的方法?
ghost34 2007-07-10
  • 打赏
  • 举报
回复
楼上为正解,不过这对于函数本身的类型会有限制,不能实现绝对意义上的通用。
xlbdan 2007-07-09
  • 打赏
  • 举报
回复
使用指向类的成员函数的指针,

如:
class A
{
public:
void fun1();
};
void A::fun1()
{
}


使用时:
void (A::*p)()=A::fun1; //p指向了类的成员函数fun1
调用时必须用对象或指向对象的指针来调用
如:
A a;
a.p(); //调用a.fun1()


按这个思路试试能不能完成你的想法吧
juicee 2007-07-09
  • 打赏
  • 举报
回复
或者用静态成员函数- -
juicee 2007-07-09
  • 打赏
  • 举报
回复
可以这样
comm_fun(demo* obj,void (* pfun1)(), void (* pfun2)())
{
...
obj->*pfun1();
...
obj->*pfun2()
}
taodm 2007-07-09
  • 打赏
  • 举报
回复
用指向成员的指针。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧