下面代码不能编译通过,不过大体意图应该看得明白,请教:问题出在哪里?如何解决?#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;
}

解决方案 »

  1.   

    以前的讨论连接:
    http://expert.csdn.net/Expert/topic/3021/3021529.xml?temp=.8147699
    http://expert.csdn.net/Expert/topic/3021/3021542.xml?temp=.5064813
      

  2.   

    在c++中,函数指针不能被赋值为成员函数的地址,及时返回类型和参数表完全匹配,比如Aaa.Fun = Bbb.bbbb;这是因为成员函数有一个非成员函数不具有的属性——类。指向成员函数的指针必须与赋值得函数类型匹配,不是两个而是三个方面都要匹配:1)参数的类型和个数;2)返回类型;3)它所属的类类型在上面的代码中swbreath则给出了在c++中成员函数指针的绑定方法
      

  3.   

    必须要作成static的才可以,否则不符合参数要求。作成static函数以后就不能再用非static成员了。
      

  4.   

    在c++builder中Borland通过增加指示字来实现,与标准不兼容
      

  5.   

    首先这样的设计是不合理的,即使编译器让你编译通过,这种调用也存在危险。
    类的成员函数,不能仅仅理解为一个函数,为什么呢,因为通常的函数只要有参数就可以工作,而类成员函数则不仅仅要参数,还需要类实例,(static函数其实相当于全局函数了)
    因为类函数要处理数据成员。
    要实现你的功能需要传送对象过去,然后通过对象调用函数才可以。
      

  6.   

    现成的解决方案框架: boost::signals 和 libsig++,可以参考文档(boost::signals 的代码我试图看过,郁闷)
      

  7.   

    成员函数的指针,VC6下编译通过,共调用3次:
    #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 ;
    }
      

  8.   

    指向成员函数的指针是完全全法的,在C++标准规范上单独说明了的,MFC中的消息映射表最后一项其实也是个指向CTarget类的成员函数的指针.
    指向成员函数的指针的在ISO/IEC14882标准的8.3.3节有详细的说明.
      

  9.   

    http://expert.csdn.net/Expert/topic/3021/3021542.xml?temp=1.565188E-02
    这里有个现成的,只提供思路,里面有很多的不足,而且还不够安全,楼主有兴趣可以自己补全
      

  10.   

    使用指向成员函数的指针时,指针前一定要有具体的实例,因为类的成员函数有个默认的this参数,编译器需要将它转成类实例的指针,如前面的(p->*ff).定义指针时则需要加上类的声明,表示这是一个指向类成员函数的指针,如前面的typedef void (CA::*FUN)() ;同样给指针赋值时也要加上类名:FUN ff = &CA::f;
      

  11.   

    用static很不安全的。QunKangLi(李群康)说的非常好。哈哈~