幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
楼主: shawind

[通用编程] [很麻烦]opengl,step 0

[复制链接]

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
 楼主| 发表于 2007-11-13 21:56:35 | 显示全部楼层
看来是我误解d手册里的那句话了。
“委托是两块数据的聚集:一个对象引用和一个函数指针。”
它这里说的对像引用,和我想的完全不是那么一回事。如果不是rednaxela花时间做这实验,我还不知道要浪费多少时间  [s:5]  [s:6]
え~え~お!!!
回复 支持 反对

使用道具 举报

8

主题

215

帖子

2223

积分

⑥精研

积分
2223
发表于 2007-11-13 21:59:51 | 显示全部楼层
[s:2] 倒没花什么时间,因为代码和出来的结果都是预先知道的。
C#里的delegate就有趣些(同时也臃肿些)……不过基本概念一样,它只关心参数个数和类型,以及返回类型
回复 支持 反对

使用道具 举报

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
 楼主| 发表于 2007-11-14 14:42:56 | 显示全部楼层
我是直接从c过来,在D中第一次接触委托这个概念,还想当然的自以为事,连个基本的实验也不作,实在是太不认真了。(当然,就算是认真起来,好像也没多大作用-_-!)
え~え~お!!!
回复 支持 反对

使用道具 举报

50

主题

742

帖子

402

积分

版主

自定义头衔

Rank: 7Rank: 7Rank: 7

积分
402
发表于 2007-11-16 20:57:19 | 显示全部楼层
关于那个函数指针的用法例子,TO FX:

但是如果拥有成员的参数怎么办,估计在传递的时候 & 符号被再分析为先存储对象的引用(地址),这样一个dg差不多就保存了一对信息,这个就和以前啥啥对象指针这样了

没看过D的规范,乱猜……
Style-C
回复 支持 反对

使用道具 举报

50

主题

742

帖子

402

积分

版主

自定义头衔

Rank: 7Rank: 7Rank: 7

积分
402
发表于 2007-11-16 20:59:20 | 显示全部楼层
TO Shawind大,有BLOG也給个罢……XD
最近觉得还是看BLOG看的东西多点XD,不过目前只有FX大的……
Style-C
回复 支持 反对

使用道具 举报

8

主题

215

帖子

2223

积分

⑥精研

积分
2223
发表于 2007-11-16 22:24:08 | 显示全部楼层
引用第13楼lw于2007-11-16 20:57发表的  :
关于那个函数指针的用法例子,TO FX:

但是如果拥有成员的参数怎么办,估计在传递的时候 & 符号被再分析为先存储对象的引用(地址),这样一个dg差不多就保存了一对信息,这个就和以前啥啥对象指针这样了

没看过D的规范,乱猜……
在D里,delegate与普通function pointer(注意D里这两者都有)的区别就是在于会保存一个环境指针。不过它的类型是void*的,所以并不在乎成员方法是属于什么类型的。
引用第14楼lw于2007-11-16 20:59发表的  :
TO Shawind大,有BLOG也給个罢……XD
最近觉得还是看BLOG看的东西多点XD,不过目前只有FX大的……
shawind大的JavaEye的blog是空的 T T
回复 支持 反对

使用道具 举报

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
 楼主| 发表于 2007-11-16 22:55:41 | 显示全部楼层
我的程序水平在javaeye里是绝对的不入流,没脸在那里记blog。[s:5]

以前学委托和函数指针的时候写了玩的,D中委托和函数指针的区别。
  1. import std.stdio:writefln;
  2. int function(int, int) padd; //函数指针
  3. int delegate(int, int) dadd; //委托
  4. int (*cpadd)(int, int);//和padd等价
  5. //int function(int, int) pfunc;
  6. //int delegate(int, int) dgfunc;
  7.    
  8. int myadd(int a, int b) {return a+b;} //在外面的函数,没有环境信息,&后为函数指针
  9. class Cmyadd
  10. {
  11.     int add(int a, int b) {return a+b;}
  12. }
  13. void main()
  14. {
  15.     static int myadd2(int a, int b) {return a+b;}//嵌套的静态函数,没有环境信息,&后为函数
  16.     int myadd3(int a, int b) {return a+b;}//嵌套的动态函数,带有环境信息,&后为委托
  17.     Cmyadd myadd4 = new Cmyadd;//类,结构中,带有环境信息,&后为委托
  18.     padd = &myadd;
  19.     writefln(padd(1,0));
  20.     padd = &myadd2;
  21.     writefln(padd(2,0));
  22. //    padd = &myadd3;//cannot implicitly convert expression (&myadd2) of type int delegate(int, int) to int(*)(int, int)
  23. //    padd = &myadd4.add;// cannot implicitly convert expression (&myadd3.add) of type int delegate(int, int) to int(*)(int, int)
  24.    
  25. //    dadd = &myadd; //cannot implicitly convert expression (& myadd) of type int(*)(int, int) to int delegate(int, int)
  26. //    dadd = &myadd2;//func.d(29): Error: cannot implicitly convert expression (& myadd2) of type int(*)(int, int) to int delegate(int, int)
  27.     dadd = &myadd3;
  28.     writefln(dadd(3,0));
  29.     dadd = &myadd4.add;
  30.     writefln(dadd(4,0));
  31.    
  32.     cpadd = &myadd;
  33.     writefln(cpadd(1,0));
  34.     cpadd = &myadd2;
  35.     writefln(cpadd(2,0));
  36. //    cpadd = &myadd3;//cannot implicitly convert expression (&myadd2) of type int delegate(int, int) to int(*)(int, int)
  37. //    cpadd = &myadd4.add;//cannot implicitly convert expression (&myadd3.add) of type int delegate(int, int) to int(*)(int, int)
  38.     int a(int delegate(int, int) fdg, int a, int b) {return (fdg(a,b));}
  39.     writefln(a(&myadd3, 5,5));
  40.    
  41.      int b(int function(int, int) fp, int a, int b) {return (fp(a,b));}
  42.     writefln(b(&myadd, 10,10));
  43. }
复制代码
え~え~お!!!
回复 支持 反对

使用道具 举报

50

主题

742

帖子

402

积分

版主

自定义头衔

Rank: 7Rank: 7Rank: 7

积分
402
发表于 2007-11-17 10:47:36 | 显示全部楼层
void* 那具体是什么类型又怎么知道呢?
恐怕每个void*先只向对象的地址,从地址中先找到具体的类型,转型了之后
才根据类型来获得对应的成员?
delegate function 非要用这两个KEYWORD来显示区分??
Style-C
回复 支持 反对

使用道具 举报

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
 楼主| 发表于 2007-11-17 12:03:52 | 显示全部楼层
好像D中void*类型在实际使用时,可以把任何类型的指针放到这里。
但如何去判断具体类型,好像D1.0还做不到,D2.0可以方便的完成这个任务。

委托和函数指针用了两个关键字。
委托必须用加关键字的写法,函数指针也可以和C一样写法。C的大部分习惯性在D中都有保留。
え~え~お!!!
回复 支持 反对

使用道具 举报

50

主题

742

帖子

402

积分

版主

自定义头衔

Rank: 7Rank: 7Rank: 7

积分
402
发表于 2007-11-17 16:52:08 | 显示全部楼层
怎么个方便呢……

不知道委托怎么实现的……C++的话通常会用一堆枚举类似的东西支持各类函数参数……总觉得好多啊(但是之后就很少了……不明白就无视掉罢……),很神奇0-0
Style-C
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2024-5-3 03:29 , Processed in 0.018010 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表