分类:
2008-01-04 12:32:20
前段时间突然想到两则现实与程序对比的例子,下面分析了下,有不当之处,见笑
1.说"从前有座山,上山有座庙,庙里有个2个和尚,老和尚给小和尚讲故事,
说"从前有座山,上山有座庙,庙里有个2个和尚,老和尚给小和尚讲故事,
说"......
上面的这个故事,相信一般人都听说过,无非是在拒绝讲故事的时候搪塞的一个冷笑话;
仔细想来,这个故事里面倒是体现了程序设计中的递归算法,可以这样描述:
---------------------------------------------------------------------------
讲故事{ // function tellStory(Monk &teller,Monk &listener)
从前有座山; // Hill hill;
上山有座庙; // Temple temple(hill)
庙里有个2个和尚; // Monk oldMonk(70),yongMonk(07);
老和尚给小和尚 "讲故事"; // tellStory(oldMonk,yongMonk);
}
---------------------------------------------------------------------------
唯一可惜的是上面的那个故事往往是在大家的笑声后结束,跟这个简单的设计一样,
算是一个异常退出的,没有回收资源,具体设计时候还应有个开始回溯的检查点 :)
2.克隆羊多利(Dolly)的事情曾经家喻户晓,代表了人类对DNA基因控制的伟大实践;至于是否
已有非法克隆的人类不得而知,不过理论上很多人相信,克隆人的关键远不是技术问题而是个
社会伦理问题;我们知道,克隆是不会有被克隆的那个主体的意志和记忆的,人的记忆和意志
是后天产生的,就像肌肉男不是天生肌肉男,靓女的后代不定会是靓女一样。
这个克隆的概念被引申到C++里面的对象克隆(深拷贝|浅拷贝)的方式,或者是"设计模式"的
原型(Prototype)结构模式,可以使用以下的类声明这样解释:
---------------------------------------------------------------------------
人 { // Human
取得DNA // public: Human *Human(const Human &);
被克隆 // public: Human *Clone(){ return new Human(*this); }
生老病死 // public: function born();older();sick();die();
衣食住行 // public: function dressing(),feeding(),resided(),walking();
七情六欲 // private: Emotion love,hate,sad,sorry ....
}
人 被克隆的人; // Human aMan;
人 克隆人甲; // Human *cloneMan = aMan.Clone();
---------------------------------------------------------------------------
其中,最关键的方式就是人类定义(其实可以认为DNA的遗传信息)中,Clone方法中,
有所谓的深拷贝与浅拷贝的问题:
1.上面的简单例子中只是个浅拷贝,意味着克隆对象与被克隆对象可能共用某些成员变量,
这个类似由于胚胎分裂不完全而产生联体婴儿,可以有对立的大脑,却不得不共用四肢;
对于这种浅拷贝公用对象的问题,在回收对象资源时候有问题:如联体人在一方死亡情况下,
要通过外科手术将或者的那个分离开来,是非常困难以至于是危险的。
2.对于深拷贝,我们必须对成员变量重分配空间;使得克隆对象也是对立的,具有受场景制约的
变量值;也就是克隆人是个独立的人,而非联体婴儿,可以具有独立的个性特色。
不过即使是深拷贝而得到的具有完全独立行为的克隆人,是不具有被克隆父对象的"思想"的,
在类的解释,就是对象的属性(成员变量),随着处在各自不同的环境,是不相同。这也就是
记忆不能被克隆的原因。