函数指针作为参数在类之间如何声明与传递

bohge 2008-12-17 05:33:32
函数指针作为参数在类之间如何声明与传递
class A
{
......
public:
void out(void);
}
class B
{
......
pubic:
void Work( void (*fpOut)(void) ); //该怎么声明?
}

void main(void)
{
A a;
B b;
B.Work( .......); //这个地方该怎么写
}
...全文
348 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
虎王小小 2008-12-18
  • 打赏
  • 举报
回复
学习
bfhtian 2008-12-18
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 lann64 的回复:]
我上面不是给出了成员函数做参数的例子了嘛。再加个注释吧。
至于普通函数和静态函数,平常都用过吧,就不再写例子了。

C/C++ code#include <cstdlib>
#include <iostream>
using namespace std;

class A
{
public:
void print(int x){ cout<<"A::print "<<x<<endl; }
};
typedef void (A::*pf)(int); //函数指针类型定义
class B
{
public:
void pp(class A& a,pf pa){(a.*pa)(20);}…
[/Quote]
up
codejian 2008-12-18
  • 打赏
  • 举报
回复
如此啊,收藏了!
SearchLife 2008-12-17
  • 打赏
  • 举报
回复
学习
nullah 2008-12-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 lann64 的回复:]
C/C++ code#include <cstdlib>
#include <iostream>
using namespace std;

class A
{
public:
void print(int x){ cout<<"A::print "<<x<<endl; }
};
typedef void (A::*pf)(int);
class B
{
public:
void pp(class A& a,pf pa){(a.*pa)(20);};
};
int main()
{
A a;
B b;
pf pa=&A::print;
(a.*pa)(10);
b.pp(a,pa);

return 0;
}
[/Quote]
up
lann64 2008-12-17
  • 打赏
  • 举报
回复
我上面不是给出了成员函数做参数的例子了嘛。再加个注释吧。
至于普通函数和静态函数,平常都用过吧,就不再写例子了。
#include <cstdlib>
#include <iostream>
using namespace std;

class A
{
public:
void print(int x){ cout<<"A::print "<<x<<endl; }
};
typedef void (A::*pf)(int); //函数指针类型定义
class B
{
public:
void pp(class A& a,pf pa){(a.*pa)(20);} //pa是一个类A的成员函数指针,类B与类A是完全独立的类,调用类A的成员函数需要一个类A的对象,这里同时传进来一个类A的对象a
};
int main()
{
A a;
B b;
pf pa=&A::print; //定义类A函数指针指向A::print函数
(a.*pa)(10); //利用类A对象a使用函数指针
b.pp(a,pa); //函数指针做参数传递

return 0;
}
wangyaosuper 2008-12-17
  • 打赏
  • 举报
回复
关键是要看你传的的函数指针是一个普通函数指针呢?还是某个对象的成员函数,处理起来不一样,

两者都可以传,

传普通函数的指针(或者静态成员函数的指针)就和C里面的一样即可。


如果穿的函数是某一个对象的成员的函数的话,比较复杂,但是肯定是可以实现的,最好的例子就是MFC的消息map,他就是在消息map其实是一个数组,里面存储了消息接收对象响应消息事件函数的地址,在消息来的时候,由MFC回调对应函数的指针,比如onButton,onDraw之类。
lann64 2008-12-17
  • 打赏
  • 举报
回复
#include <cstdlib>
#include <iostream>
using namespace std;

class A
{
public:
void print(int x){ cout<<"A::print "<<x<<endl; }
};
typedef void (A::*pf)(int);
class B
{
public:
void pp(class A& a,pf pa){(a.*pa)(20);};
};
int main()
{
A a;
B b;
pf pa=&A::print;
(a.*pa)(10);
b.pp(a,pa);

return 0;
}
xuruichen 2008-12-17
  • 打赏
  • 举报
回复
静态类型可以传,非静态类型成员函数指针不能传。
学了一招。
xuruichen 2008-12-17
  • 打赏
  • 举报
回复
静态类型可以传,非静态类型成员函数指针不能传。
学了一招。
xdkui 2008-12-17
  • 打赏
  • 举报
回复
另外
class A
{
......
public:
static void out(void); //要加static才可以传, 非static成员函数指针不行
w382120035 2008-12-17
  • 打赏
  • 举报
回复
class B
{
public:
friend class A;
void Work( void (A::*fpOut)(void) )
} ;

b.Work(a.out);
xuegao007 2008-12-17
  • 打赏
  • 举报
回复
void (A::*fpOut)(void)
ysuliu 2008-12-17
  • 打赏
  • 举报
回复
typedef void (*fpOutType)(void);

class B
{
......
pubic:
void Work( fpOutType a ); //该怎么声明?
}

b.Work(a.out);
san_126 2008-12-17
  • 打赏
  • 举报
回复
typedef void (*pOut) (void);

class B
{
......
pubic:
void Work( pOUt ); //该怎么声明?
};

void main(void)
{
A a;
B b;
pOut = ...
B.Work( pOut ); //这个地方该怎么写
}

是这个样子不
jieao111 2008-12-17
  • 打赏
  • 举报
回复
加上A的名字空间就行了把

65,210

社区成员

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

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