看板java
标 题Re: 请问阵列的宣告…
发信站清华资讯(枫桥驿站) (Mon Jun 21 03:40:39 2004)
转信站ptt!ctu-reader!ctu-peer!news.nctu!news.csie.ncyu!news.cs.nthu!maple
> 我一直希望 C/C++ 能够把他化简成
> function fa (x)
> {
> if (x % 1)
> {
> cout << "Yes!";
> return 1;
> } else {
> cout << "No!";
> return 0;
> }
> }
用template+转型设施已经可以达成你要的效果, 而且还有type-safe的优
点
如下:
template<typename P>
int fa(P& x)
{
if (x % 1) {...return 1;} else{return 0;}
}
int i= fa(1);
class1 c1= fa(1); //class1中必须定义建构式 class1(int i),
// operator=(int i);
class2 c2= fa(class3()); //class2 中必须定义建构式 class2(int i) ,
// operator=(int i);
// class3必须定义 operator %
这样的作法跟script的差别就在於script用一个共通的type来函括所有type
(如vb的variant, js的var) 所以当函式回一个共通的type时,他可能是
int, 可能是char, 可能是一个object, 这时程式要怎麽处理就完全依靠
程式"内隐"的规则. 例如,
function func(x)
{ if (x==1) return CreateObject("xxx.xxx");
else return 1;}
请问, 呼叫func的客户端要怎麽能知道他拿到的是int还是 object?
答案是客户端得去了解func的实作内容. 这样的情形严重的伤害到程式
的封装与抽像特性. 所以script并不适合开发大型程式.
而使用c++, 你可以使用template让function享有类似script的弹性
又不损及type-safety及runtime performace. 댊 high-level, type-safety, efficiency是c++的特性, 要让c++改用
script的方式就好像叫c++自废武功一样
至於你下面所提的例子, 事实上script的变数并非没有型别,
而是他们都是继承至同一个共通的型别,好比是java跟.net的共同基底类别
vb的variant也是类似的观念. 而script把这类别的宣告藏了起来,好让程式
简化. 所以以下面的c++程式来看, c++也只是把这之间的关系描述出来.
你可说c++很繁琐, 但是至少, 在程式中描述出来的继承关系, 可以让
compiler提早揪出错误的型别使用. 减少在runtime出错的可能. 更可加强
程式的可读性,结构性,逻辑性. 你可以想像一下, 如果dynamic传回
的一定是bicycle or car之类的交通工具, 为何不在程式明确的指出
dynamic只会回传交通工具这件事 ,却要让使用者冒着可能不小心把回传
的交通工具当成建筑物来使用的风险, 其道理何在?
另外, union的作法绝对是最差的,完全不用考虑.
> 深入范例:(很重要的编程风格范例)
> 尝试思考下面这个例子:
> function dynamic (x)
> {
> if (x % 1)
> return Bicycle(x);
> else
> return Car(x);
> }
> 这可好了,编译器该如何做?我尝试着将上面的函式翻译成 C++
> 解法一:使用基础类别再加以继承之。
> class CC { …略… } ;
> class Bicycle : CC { …略… };
> class Car : CC { …略… };
> template<class T>
> CC * dynamic(T x)
> {
> if (x%1)
> return new Bicycle(x);
> else
> return new Car(x);
> }
--
※ Origin: 枫桥驿站<bbs.cs.nthu.edu.tw> ◆ From: NK219-91-119-85.adsl.dynamic.apol.com.tw