"函数指针"如何传递"类的成员函数"?

yaoyansi 2006-05-08 01:13:09
由于程序设计的需要,我想要把类B的成员函数传给类A。可是不知道应该如何写,我写了下面的demo程序,但是编译无法通过。

如何用函数指针传递某个类的成员函数呢?
请大家指点,谢谢!

demo程序如下,编译无法通过:
//---------------------------------------------------------------------------
#include <stdio.h>

class A{
public:
A(void (*f)(void));//f为传进来的函数
virtual~A();
aa();//调用函数_ff()
private:
void (*_ff)(void);
};
//
A::A(void (*f)(void)){ _ff = f; }
//
A::aa(){ _ff(); }


//--------------------------------------

class B{
public:
B();
void set();
bb();//把set()赋值给函数指针,传给A类
virtual~B();

void (*f)(void);//函数指针
int _x;
};
//
B::B(){ bb();}
//
B::bb()
{
void (*f)(void);
f = set();//编译时此处错误:error C2440: '=' : cannot convert from 'void' to 'void (__cdecl *)(void)'
A *a = new A(f);
}
//
void B::set(){
this->_x = -1;
printf("\n this is B::set");
}


void main()
{
B *b=new B();

}
//------------------------------------------------------------------------------------------
...全文
191 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
navi_dx 2006-05-08
  • 打赏
  • 举报
回复
先搞清楚成员函数指针的意义吧,帮你改一下

class B;

class A{
public:
A(void (B::*f)(void), B* pb);//f为传进来的函数
aa();//调用函数_ff()
private:
void (B::*_ff)(void);
B* m_pb;
};
//
A::A(void (B::*f)(void), B* pb){
_ff = f;
m_pb = pb;
}
//
A::aa(){ (m_pb->*_ff)(); }


//--------------------------------------

class B{
public:
B();
void set();
bb();//把set()赋值给函数指针,传给A类

void (B::*f)(void);//函数指针
int _x;
};
//
B::B(){ bb();}
//
B::bb()
{
void (B::*f)(void);
f = &B::set;
A *a = new A(f, this);
}
//
void B::set(){
this->_x = -1;
printf("\n this is B::set");
}


void main()
{
B *b=new B();
}
adintr 2006-05-08
  • 打赏
  • 举报
回复
成员函数指针的基本用法是这样的:
class A
{
public:
void fun2()
{
std::cout<<"Hello World!"<<std::endl;
}
};

int main()
{
A a;
void (A::*f)();
f = &A::fun2;
(a.*f)();
}
yaoyansi 2006-05-08
  • 打赏
  • 举报
回复
“你把成员函数指针转换为 void (*)(void) 相当于去掉了这个参数,当然不行了。”
那么,应该怎么写呢?
yaoyansi 2006-05-08
  • 打赏
  • 举报
回复
也许 boost.function 会有些帮助,正在学习boost.function
adintr 2006-05-08
  • 打赏
  • 举报
回复
....

this 指针是再调用函数的时候需要,不是在取函数指针的时候需要。。。
类成员函数和普通函数一样,只是有一个隐藏的 this 参数,在调用的时候需要给出。
你把成员函数指针转换为 void (*)(void) 相当于去掉了这个参数,当然不行了。
yaoyansi 2006-05-08
  • 打赏
  • 举报
回复
呵呵
f = set();是在B的成员函数内部,所以
和f = this->set();的效果是一样的

两种写法,编译时都是同样的错误

请诸位继续赐教!很急!!
谢谢!
adintr 2006-05-08
  • 打赏
  • 举报
回复
建议你看 boost::function 库,
成员函数指针的使用需要一个 this 指针,必须得有一个对象。

64,682

社区成员

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

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