易码技术论坛

 找回密码
 加入易码
搜索
查看: 297004|回复: 6

[转载]c++表达利器

[复制链接]
发表于 2006-11-17 11:35:40 | 显示全部楼层
SF...And shooting那里有没有DX的相关教程资料哦~
发表于 2006-11-17 13:12:12 | 显示全部楼层
他没有这种东西,DX的去GameRes查吧。
下载个D9的SDK,里面的教程也不错的。
发表于 2006-11-17 13:41:10 | 显示全部楼层
引用第2楼FantasyDR2006-11-17 13:12发表的“”:
他没有这种东西,DX的去GameRes查吧。
下载个D9的SDK,里面的教程也不错的。
GameRes里面只找到一个连载的第二篇...
D9SDK下载中...0.5KMB...
发表于 2006-11-17 13:44:09 | 显示全部楼层
0.5KMB?
500M?
 楼主| 发表于 2006-11-17 13:50:36 | 显示全部楼层
大概0.5k/s吧
发表于 2006-11-17 14:25:01 | 显示全部楼层
500MB的说...
 楼主| 发表于 2006-11-17 10:59:13 | 显示全部楼层 |阅读模式
  这个是很久以前写的文章了,是篇对c++表达方式的总结,关于更多的这方面内容可以参考《c++多范性编程(设计?)》这本书

学习c++这么久了,一直想总结一下。有感于c++强大的表达能力,本来想从理念上写写c++是怎样表达各类概念的,将要动手发现自己水平不够,还不足以把握这些思想,所以只好从技术上罗列一下c++中表达的工具,至于理念则随便说说感想吧

首先要弄清楚,“表达”的意思。表达不同于实现。一个概念,一种设计,任何一种语言都实现的出来,毕竟全部和图灵机等价嘛,大不了用汇编。但是表达式另一层意思。他是指要相对直接的表达出抽象的概念,而不是将概念具体化到过于底层的代码上。比如,对于class这种概念,没有class的语言也照样可以实现,很多c程序就是用struct+函数指针来模拟这个东西的,但是缺点就是不够直观,不够简练,而在c++中就可以直接的表达class的概念,是被语言直接支持的。

不准备写c中的东西了,变量指针结构数组函数,早就被人吃透了,而且实现力足够,表现力在现代的应用中已经捉襟见肘了。

先说函数重载。技术相比大家都很熟悉,同一个名字的函数,可以接受不同种类的参数。在调用时根据调用参数的种类判断调用哪个函数。这个技术看起来挺简单,但是如果一个语言对其支持,那么必定会从技术层面上升到设计甚至理念层面。对于函数重载,表达的即是某种功能对于输入的包容性。如果一个功能只提供严格的接口,那么对他的使用就不够灵活,也表示这个功能对于某种表示方法的认可。而相反如果一个功能提供了各种调用方式,则代表这个功能认可各种参数的表达方式。这涉及到一个系统中信息表达的统一性。例如在函数MoveTo中,MoveTo可以接受两个整形变量作为参数,也可以接受某个物体作为参数,那么就表明这个物体在屏幕表示的时候,可以代表一个位置。从设计上来讲,这个物体免不了要暴露自己的位置。


下面是函数默认值。首先要讲,这个功能是一个很好用的功能,他为设计者提供了极大的方便。函数默认值,从技术角度来讲,就是一个函数在调用时可以省略后面的若干参数,这些参数的值由设计者提供。要注意的是只能省略最后若干个参数,不能跳开,否则编译器无法判断。

这种默认值方法在设计角度上讲是提供了一个普适的,大部分情况下不需要修改,甚至使用可以不用知道的一个参数值,但是为特殊情况留下了足够的余地可以配置这个函数的行为。这已经不是技术的概念了,而是设计中的方法。例如在游戏设计中,设计一个a*算法,在计算估价函数的时候,已用代价和理目标的距离之间要有一个合适的比例,这个比例可以通过实验或者理论推导确定,但是对于某些特殊应用,这个比例可能需要最较大的修改,所以可以作为默认参数传入,平时不用去关心它。一旦有特殊需要,可以起用这个参数来配置函数。


class,class无疑是近年来最火爆的东西之一,从概念上讲面向对象的表达方式直接可以表达具体的实体,世间万物皆对象。实现中他是数据与方法的漂亮的结合,封装,继承等等功能更是锦上添花,谈class要分几个方面

封装,信息隐藏。从实现上,可以阻挡对不该取得的数据的获取,保证信息的归属权,理清了数据拥有者的责任,不会出现多个地方共同修改一个数据导致天下大乱的现象。感念上讲,提出了私有概念,私有信息是不可见的,外界根本应该无视这些信息,这在设计时大大简化了信息量,面对大量信息的时候,能把他们归属到各自的类中,设计者就可以直接面对高层的概念,而不用操心底层的信息,因为他根本看不到:)

继承。从实现讲,代码重用是他的一个重要功能,但是它主要用在概念表达上,表达是一个的关系,这是个重要的关系,对概念的提取有很深刻的意义。当一堆概念摆在设计者面前的时候,突然发现这些概念中一大部分是一个xx,这样这一大部分概念可以立刻被合并到某个父概念之下,通过继承父概念来表现自己的个性。

多继承。没问题,多继承是一个非常重要技术和方法。即使很多人反对,但是c++秉承相信程序员的传统,保留了这项功能。所谓是一个,可以不仅仅局限于是某一种东西,一个对象之所以存在可以有很多方面,一个游戏中的物体可以是一个坦克,也可以是一个图片,这种东西就可以用多继承表达。多继承要提的一点就是所谓的菱形结构,一个类继承的多个父类拥有共同的祖先,这是就要注意了,是不是采用虚继承,采用虚继承后的效率问题,先期的设计问题,都需要考虑。所以多继承也是个备受争议的东西,不建议初学者乱用,尤其是有成员的那种父类的多继承,就是被c#和java等提倡易上手的语言禁止了。

另外,要做父类的类别忘了把析构函数搞成虚的。


模板,绝对是c++中重中之重的武器,近年来由于发展势头火爆,已经成了c++的一门标志了。

模板的最早的作用就是泛化容器,某种容器可以放置各种类型的数据,实现时就可以实现为摸板,具体写的时候在进行模板实例化,变成相应的类的容器。可以说,从技术上讲模板的主要功能就是一个高级的宏,一个高级代码生成器。但是一个技术应用久了,必然对设计产生影响,最近出现的元编程,模板表达式,concept(这个词太专有了,没办法翻译过来……)等设计概念都是针对模板这项技术提出的。关于这块我也把握不住,比较重要,也是比较难理解的部分是关于模板的偏特化,template template 参数,另外模板的递归式实例化等技术也是支持这些新概念的基础。一本叫《c++设计新思维》的书相当的棒,《c++ template》也很不错。

模板很难讲,自己用得不多,参考书也少,就不细说了。


上面列举了几个c++中比较猛的东西,还有其他一些如typedef,指向成员的指针,namespace等等就不一一列举了,他们分别在不同的设计中扮演了各种不同的角色,也值得关注。

这几项技术其实很多人也都清楚,但是实现是很少能想到他们,利用他们去提高编程效率。面对同一个问题,c++为人们提供了各种解决问题的办法,关键在道路的选择上。如果没有经验的话,不妨按照这个列表多试试,各种路子都走走,走多了才能领会这些技术背后的思想以及他们代表的理念,在设计的时候才能有方向,知道什么技术适合什么概念,等有了经验,也就不需要这个列表。到时候是从问题直接找到技术,而不用去试验了。


其实c++最猛的东西都不在上面,c++最猛的东西其实是他的语言的正交性。上面所有列出的技术,全部可以混合使用,这才是用c++表达时那种无以伦比的畅通感的来源,试试吧,template+虚函数+多继承+成员指针+重载+默认参数,他们全部可以无缝的整合到一起。本来世界上的概念都没有这么简单,并不是一种范性就可以搞定的,这种多范性混合的特性才是c++独有的性质,值得好好品味一下。
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-4-20 19:25 , Processed in 0.010341 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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