下面代码不能编译通过,不过大体意图应该看得明白,请教:问题出在哪里?如何解决?#include "stdio.h"typedef void (*FUN)(void);class CA
{
public:
FUN Fun;
void aaaa(void);
};class CB
{
public:
void bbbb(void);
};class CC
{
public:
void cccc(void);
};void CA::aaaa(void)
{
if(Fun != 0)
Fun();
}void CB::bbbb(void)
{
printf("bbbb");
}void CC::cccc(void)
{
printf("cccc");
}int main(void)
{
CA Aaa;
CB Bbb;
CC Ccc; Aaa.Fun = Bbb.bbbb;
Aaa.aaaa();
Aaa.Fun = Ccc.cccc;
Aaa.aaaa();
return 0;
}★★★ 以下对第一帖的回答做一下总结:★ Delphi中的实现方法:program Project2;{$APPTYPE CONSOLE}uses
SysUtils;typeTFUN = procedure of object;CA = class
public
Fun: TFUN;
procedure aaaa;
end;CB = class
public
procedure bbbb;
end;CC = class
public
procedure cccc;
end;{ CA }procedure CA.aaaa;
begin
if assigned(Fun) then
Fun;
end;{ CB }procedure CB.bbbb;
begin
writeln('bbbb');
end;{ CC }procedure CC.cccc;
begin
writeln('cccc');
end;var
Aaa: CA;
Bbb: CB;
Ccc: CC;begin
Aaa := CA.Create;
Bbb := CB.Create;
Ccc := CC.Create; Aaa.Fun := Bbb.bbbb;
Aaa.aaaa;
Aaa.Fun := Ccc.cccc;
Aaa.aaaa;
end.★ CB,CC不一定是static,所以不要用static ★ swbreath(雪白呼嘘)的实现方法:
严重依赖CB,CC,难以复用#include "stdio.h"class CB
{
public:
// void (CB::*pfun1)(void);
void bbbb(void);
};
class CC
{
public:
// void (CC:: *pfun2)(void);
void cccc(void);
};
void (CB::*pfun1)(void);
void (CC::*pfun2)(void);class CA
{
public:
void aaaa(void* pObj,int type);
};
void CA::aaaa(void* pObj,int type)
{
if(type==1)
{
CB *p=(CB*)pObj;
(p->*pfun1)();
}else
{
CB *p=(CB*)pObj;
(p->*pfun1)();
}
}void CB::bbbb(void)
{ printf("bbbb");
}void CC::cccc(void)
{
printf("cccc");
}int main(void)
{
CA Aaa;
CB Bbb;
CC Ccc;
pfun1 = Bbb.bbbb;
Aaa.aaaa(&Bbb,1);
pfun2 = Ccc.cccc;
Aaa.aaaa(&Ccc,2);
return 0;
}
{
public:
FUN Fun;
void aaaa(void);
};class CB
{
public:
void bbbb(void);
};class CC
{
public:
void cccc(void);
};void CA::aaaa(void)
{
if(Fun != 0)
Fun();
}void CB::bbbb(void)
{
printf("bbbb");
}void CC::cccc(void)
{
printf("cccc");
}int main(void)
{
CA Aaa;
CB Bbb;
CC Ccc; Aaa.Fun = Bbb.bbbb;
Aaa.aaaa();
Aaa.Fun = Ccc.cccc;
Aaa.aaaa();
return 0;
}★★★ 以下对第一帖的回答做一下总结:★ Delphi中的实现方法:program Project2;{$APPTYPE CONSOLE}uses
SysUtils;typeTFUN = procedure of object;CA = class
public
Fun: TFUN;
procedure aaaa;
end;CB = class
public
procedure bbbb;
end;CC = class
public
procedure cccc;
end;{ CA }procedure CA.aaaa;
begin
if assigned(Fun) then
Fun;
end;{ CB }procedure CB.bbbb;
begin
writeln('bbbb');
end;{ CC }procedure CC.cccc;
begin
writeln('cccc');
end;var
Aaa: CA;
Bbb: CB;
Ccc: CC;begin
Aaa := CA.Create;
Bbb := CB.Create;
Ccc := CC.Create; Aaa.Fun := Bbb.bbbb;
Aaa.aaaa;
Aaa.Fun := Ccc.cccc;
Aaa.aaaa;
end.★ CB,CC不一定是static,所以不要用static ★ swbreath(雪白呼嘘)的实现方法:
严重依赖CB,CC,难以复用#include "stdio.h"class CB
{
public:
// void (CB::*pfun1)(void);
void bbbb(void);
};
class CC
{
public:
// void (CC:: *pfun2)(void);
void cccc(void);
};
void (CB::*pfun1)(void);
void (CC::*pfun2)(void);class CA
{
public:
void aaaa(void* pObj,int type);
};
void CA::aaaa(void* pObj,int type)
{
if(type==1)
{
CB *p=(CB*)pObj;
(p->*pfun1)();
}else
{
CB *p=(CB*)pObj;
(p->*pfun1)();
}
}void CB::bbbb(void)
{ printf("bbbb");
}void CC::cccc(void)
{
printf("cccc");
}int main(void)
{
CA Aaa;
CB Bbb;
CC Ccc;
pfun1 = Bbb.bbbb;
Aaa.aaaa(&Bbb,1);
pfun2 = Ccc.cccc;
Aaa.aaaa(&Ccc,2);
return 0;
}
http://expert.csdn.net/Expert/topic/3021/3021529.xml?temp=.8147699
http://expert.csdn.net/Expert/topic/3021/3021542.xml?temp=.5064813
类的成员函数,不能仅仅理解为一个函数,为什么呢,因为通常的函数只要有参数就可以工作,而类成员函数则不仅仅要参数,还需要类实例,(static函数其实相当于全局函数了)
因为类函数要处理数据成员。
要实现你的功能需要传送对象过去,然后通过对象调用函数才可以。
#include <iostream>
using namespace std ;
class CA {
public:
void f(void) { cout << "Call..." << endl; }
} ;typedef void (CA::*FUN)() ;class CB {
public:
FUN fb ;
CA bca ;
CB() : fb( &CA::f ) {;}
void Call() { (bca.*fb)() ; }
} ;
int main()
{
FUN ff = &CA::f ;
CA ca, *p = &ca ;
(p->*ff)();
(ca.*ff)(); CB cb ;
cb.Call() ; return 0 ;
}
指向成员函数的指针的在ISO/IEC14882标准的8.3.3节有详细的说明.
这里有个现成的,只提供思路,里面有很多的不足,而且还不够安全,楼主有兴趣可以自己补全