紧急求助.函数指针问题!(在线等待)

cpsoft 2003-12-14 12:01:01
怎么把一个对象中的函数名指针付值给另一个类中的函数指针;

typedef int(*fn)();
class a
{
public:
a(){};
~a(){};
fn f;
}

class b
{
public:
b(){};
~a(){};
int f();
}

void main()
{
a Ca;
b Cb;
Ca.f=Cb.f;
}

有没有办法,怎么办?
...全文
28 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
cpsoft 2004-02-29
  • 打赏
  • 举报
回复
几天没来,这么多人讨论了!
谢谢大家了!不过谁试验了,有可以通过的例子吗??
wyj_215 2004-01-14
  • 打赏
  • 举报
回复
typedef int(b::*fn)();
class b
{
public:
b(){};
~a(){};
int f();
}

class a
{
public:
a(){};
~a(){};
fn f;
b* bIn;
void test(){ bIn->*f();};
}



void main()
{
a Ca;
b Cb;
Ca.f=Cb.f;
Ca.bIn = &Cb;
Ca.test();
}
abitz 2004-01-14
  • 打赏
  • 举报
回复
不一样吗?我咋没看出来?
具体说说。
kulaza 2004-01-14
  • 打赏
  • 举报
回复

to:abitz(阿奈)
能不能帮我解释一下例1中的这句话a.f = &(bbb::f);
为什么&(bbb::f)的值和a.f的值不一样?
yfwill 2004-01-14
  • 打赏
  • 举报
回复
abitz(阿奈) 说的对。
class b
{
public:
b(){};
~a(){};
int f();
}
中,f()在c++的编译器处理后实际为:int f( b this);//b为其类
而静态成员函数不会传递b this参数
abitz 2004-01-08
  • 打赏
  • 举报
回复
例子2:
如果类中的member function为non-static,那么必须类实例或指针才能调用。
(就是上面我写的那个,列在这里看着方便)
using namespace std;
class bbb;
typedef int(bbb::*MPIFV)();

class aaa
{
public:
MPIFV f;
};

class bbb
{
public:
int f()
{
cout << "bbb::f() called" << endl;
return 1;
}
};

void main()
{
aaa a;
bbb b;
bbb *pb = &b;
a.f = &(bbb::f);
cout << (b.*a.f)() << endl;
cout << (pb->*a.f)() << endl;
}

运行结果:
bbb::f() called
1
bbb::f() called
1
Press any key to continue
abitz 2004-01-08
  • 打赏
  • 举报
回复
如果类中的member function为non-static那么只能作为pointer to member function
被赋值给另一个pointer to member function,并且调用时需要class的实例或指向
实例的指针来调用。这里需要实例或指针的原因是很显然的:non-static member function
要操作non-static data member(如果不是,那为什么这个member function不被声明为
static哪?),而这些non-static data member一定是属于某个实例的,如果不指明是
哪个实例,那这个member function又该如何工作?

看看楼主的需求,如果不希望(或不需要)类的实例支持就可以调用他的member function,(即而只要类的行为,不要类的实例),这就说明这个member function是static的。
如果类中的member function为static,那么他可以象普通函数一样被赋值给一个普通函数
指针(见下面的例子)。因此,这个函数指针的问题其实不是个问题,只要明确需求就够了:
我们到底需要那种行为?static还是non-static?

例子:
如果类中的member function为static,那么他可以象普通函数一样被赋值给一个普通函数
指针:
typedef int(*PIFV)();
class aaa
{
public:
PIFV f;
};

class bbb
{
public:
static int f()
{
cout << "bbb::f() called" << endl;
return 1;
}
};

void main()
{
aaa a;
a.f = &(bbb::f);
cout << (*a.f)() << endl;
}

运行结果:
bbb::f() called
1
Press any key to continue

missOY 2004-01-08
  • 打赏
  • 举报
回复
Study!
fierygnu 2004-01-08
  • 打赏
  • 举报
回复
认识有问题。
li190 2004-01-08
  • 打赏
  • 举报
回复
明白些了,多谢!需要再反复揣摩,看来没有具体使用经验想起来就是累,容易误入歧途:)
li190 2004-01-07
  • 打赏
  • 举报
回复
langzi8818(chinajiji←目标→突破自己↑) ,你这样似乎并没有实现楼主的目的吧(还是根本就不能实现?请高手解释)

#include <iostream>
#include <string>

using namespace std;

class b;
typedef int (b::*fn)();

class a
{
public:
a(){};
~a(){};
fn f;
};

class b
{
public:
b(){};
~b(){};
int f()
{
cout << "dd" << endl;
return 3; //这里改1 ---〉3
}
};

void main()
{
a Ca;
b Cb;

cout << Ca.f << endl;
Ca.f = Cb.f; //
cout << Ca.f << endl; //测试却为1,说明没有调用类b里面的f()
}
li190 2004-01-07
  • 打赏
  • 举报
回复
也许我没说清楚,我觉得楼主的意思是想把类b中的成员函数“拿”到a类中去用,即:Ca.f可以实现Cb.f()的整个过程(输出"dd",返回值3)。
你的这一句 cout << (Cb.*(Ca.f))() << endl; 还是对Cb而言的,我加上 cout << Ca.f 还是输出1,而不是3啊!
(是不是我的想法不能实现还是有认识上的错误?多谢!)
fierygnu 2004-01-07
  • 打赏
  • 举报
回复
abitz(阿奈)对了。
成员函数指针不能直接调用,必须有类实例。
laomai 2004-01-07
  • 打赏
  • 举报
回复
mark
abitz 2004-01-07
  • 打赏
  • 举报
回复
可以直接赋值,不过语法比较恶心,看看这个:
class b;
typedef int (b::*fn)();

class a
{
public:
a(){};
~a(){};
fn f;
};

class b
{
public:
b(){};
~b(){};
int f()
{
cout << "dd" << endl;
return 3; //这里改1 ---〉3
}
};

void main()
{
a Ca;
b Cb;

cout << Cb.f() << endl;
Ca.f = &(b::f);
cout << (Cb.*(Ca.f))() << endl;//测试却为1,说明没有调用类b里面的f()
}
hdsunwind 2004-01-07
  • 打赏
  • 举报
回复
直接赋值应该不行,可以采用变通的方法,如下:
class CB
{
public:
CB() {};
~CB() {};
int f() { cout << "CB::f" << endl; return 1; } ;
};

int f()
{
CB b;
return b.f();
}

typedef int (*fn)(void);

class CA
{
public:
CA() {};
~CA() {};
fn f;
};

void main()
{
CA Ca;
CB Cb;

Ca.f = f;

Ca.f();
}
sharkhuang 2004-01-07
  • 打赏
  • 举报
回复
C++的名字空间!和类空间的概念
Wolf0403 2003-12-14
  • 打赏
  • 举报
回复
class A
{
public:
void func();
};

A::func(); 的类型是 void (A::*)(void) 而不是 void (*) (void);因此你的赋值不可能成功。
好像 bcb 的 __closure 关键字有类似的效果,但是不熟悉 BCB。
cpsoft 2003-12-14
  • 打赏
  • 举报
回复
有没有高手啊?
wangyangcheng 2003-12-14
  • 打赏
  • 举报
回复
TO:Wolf0403
void (A::*)(void)只是完整地表示了A::func()的域和類型﹐而類型只是講的其返回值和參數吧?
加载更多回复(2)

64,637

社区成员

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

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