请顶尖高手进来关注一下,为什么这个思路在Delphi下极易实现,在C++中却遇到这么大的困难。

wcmwcm 2004-05-06 02:18:19
这个帖子,别人提过,但结果并不理想,我在Delphi做过,C++却行不通。

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


...全文
49 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
freefalcon 2004-05-06
  • 打赏
  • 举报
回复
唉,vc版才一个裤衩,以后再过来
freefalcon 2004-05-06
  • 打赏
  • 举报
回复
感谢楼主,过来领分来了,:)
参见另一贴
http://expert.csdn.net/Expert/topic/3036/3036049.xml?temp=.8451044
排除盗分嫌疑
wcmwcm 2004-05-06
  • 打赏
  • 举报
回复
yingpf(阿飛):
谢谢,我要实现的是将两个类完全分离,这两个类并不一定是继承关系,而且,CA类早就存在,也不能修改,他只提供接口(函数指针),不管谁来实现
yingpf 2004-05-06
  • 打赏
  • 举报
回复
用虚函数和继承性就可以啊,不过思路可能有点不一样,但多态性是C++的一大特性,不用就可惜了。

#include "stdio.h"

//typedef void (*FUN)(void);

class CA
{
public:
// FUN Fun;
virtual void aaaa(void);
};

class CB :public CA
{
public:
void aaaa(void);
};

class CC :public CA
{
public:
void aaaa(void);
};

void CA::aaaa(void)
{
// if(Fun != 0)
// Fun();
printf(aaaa"");
}

void CB::aaaa(void)
{
printf("bbbb");
}

void CC::aaaa(void)
{
printf("cccc");
}

int main(void)
{
CA Aaa;
CB Bbb;
CC Ccc;

CA *pC = &Aaa;
pC->aaaa(); //
pC = &Bbb;
pC->aaaa(); //
pC = &Ccc;
pC->aaaa(); //不知楼主是不是这个意思,如果是链表的话,用个循环就OK

/* Aaa.Fun = Bbb.bbbb;
Aaa.aaaa();
Aaa.Fun = Ccc.cccc;
Aaa.aaaa(); */

return 0;
}
flxAD 2004-05-06
  • 打赏
  • 举报
回复
我认为,用template可以解决,不过我不会。。。大家以为如何?

附:一个简单示例:
#include "stdio.h"

class CA
{
public:
void Draw(void) ;
};

class CB
{
public:
void Draw(void) ;
};

class CC
{
public:
void Draw(void) ;
};

void CA::Draw(void)
{
printf("aaaa\n");
}

void CB::Draw(void)
{
printf("bbbb\n");
}

void CC::Draw(void)
{
printf("cccc\n");
}

template <typename GeoObj>
void myDraw(GeoObj obj)
{
obj.Draw();
}

int main(void)
{
CA Aaa;
CB Bbb;
CC Ccc;

myDraw(Aaa);
myDraw(Bbb);
myDraw(Ccc);

return 0;
}
wcmwcm 2004-05-06
  • 打赏
  • 举报
回复
xdljf(hunter) :
继承和多态不够通用
wcmwcm 2004-05-06
  • 打赏
  • 举报
回复
xdljf(hunter) :
不够通用
wcmwcm 2004-05-06
  • 打赏
  • 举报
回复
sxy_9761() :
你说的很对,关键是C++怎么实现。
xdljf 2004-05-06
  • 打赏
  • 举报
回复
对呀,继承和多态就可以摆平
sxy_9761 2004-05-06
  • 打赏
  • 举报
回复
CA.aaaa(),CB.bbbb(),CC.cccc()都有一个隐含参数this,而FUN没有.
将 CA.aaaa(),CB.bbbb(),CC.cccc()设成静态成员函数

Delphi代码如下:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

TFun = procedure of object; // TFun声明成类函数

TClassA = class
Fun : TFun;
procedure aa;
end;

TClassB = class
procedure bb;
end;

TClassC = class
procedure cc;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{ TClassC }

procedure TClassC.cc;
begin
ShowMessage('CC');
end;

{ TClassA }

procedure TClassA.aa;
begin
if Assigned(Fun) then
Fun();
end;

{ TClassB }

procedure TClassB.bb;
begin
ShowMessage('BB');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
aa : TClassA;
bb : TClassB;
cc : TClassC;
begin
aa := TClassA.Create;
bb := TClassB.Create;
cc := TClassC.Create;
aa.Fun := bb.bb;
aa.aa;
aa.Fun := cc.cc;
aa.aa;
cc.Free;
bb.Free;
aa.Free;
end;

end.
wcmwcm 2004-05-06
  • 打赏
  • 举报
回复
谢谢各位,请转到继续讨论
http://expert.csdn.net/Expert/topic/3036/3036049.xml?temp=.3544733
sxy_9761 2004-05-06
  • 打赏
  • 举报
回复
CA.aaaa(),CB.bbbb(),CC.cccc()与函数指针FUN类型不一致
hahu 2004-05-06
  • 打赏
  • 举报
回复
我想这和把类的成员函数当成线程函数时候出现的问题是一样的

看这篇文章,把bbb,ccc设为static或许有效
http://www.vczx.com/article/show.php?id=343

Aaa.Fun = Bbb::bbbb;
Aaa.aaaa();
Aaa.Fun = Ccc::cccc;
snowx 2004-05-06
  • 打赏
  • 举报
回复
把错误贴出来看看
Pipi0714 2004-05-06
  • 打赏
  • 举报
回复
我想提示信息是说:类的方法也就是函数不能转换成其他的函数。我想起:这就是Object Pascal 与 C++的区别,我想你可学学C++的多态继承这个问题应该很容易解决,主要是继承与虚拟函数。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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