王朝网络
分享
 
 
 

clone模式在平衡排序二叉树实现中的应用

王朝vc·作者佚名  2006-01-17
宽屏版  字体: |||超大  

clone模式在平衡排序二叉树实现中的应用

作者:wujinglong

下载本文示例源代码

clone模式既prototype模式,是构造模式中的一种。其意图为:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

关键代码如下:

virtual product * prototype::clone(){

return new prototype(this-datas);

}

virtual product * concreteprototype_1::clone(){

//return copy of self

return new concreteprototype_1(this-datas);

}

virtual product * concreteprototype_2::clone(){

//return copy of self

return new concreteprototype_2(this-datas);

}

有Java经验的会在Object中看到clone方法。

clone模式有两个问题:

(一)内存泄漏,在clone函数中新建了一个对象,如果没有在外部接收它,它就不会自己释放自己。

(二)clone一个组件,如组合模式(composite)产生的抽象对象。

第一个问题的解决方案为智能指针,有很多文献介绍过这类问题。

这里讨论如何用clone模式clone一个组件。

virtual component * component::clone(){

component * pnew = new component(this-datas);

for(all components of this object (this-o)){

if(this-o != NULL)

//复制本组件中的每一个元件

pnew-o = this-o-clone();

}

return pnew;

}譬如一个链表结点类:class Node{

private:

DataType datas;

Node * next;

public:

virtual Node* clone(){

Node* pnew=new Node(this-datas);

if(this-next != NULL)pnew-next = this-next-clone();

return pnew;

}

//other codes

}

这样复制一个结点与复制一个链表统一起来了,不是很好吗?大功告成。

但是不要高兴太早,现在有一个链表,是循环链表(单向),试用上面方法复制它。 你将会进入死循环,最后内存耗竭而报错.

最后一个结点的下一个为头结点,应该将其后向指针指向新建的头结点,而不是再生成一个结点。

即将上面代码改为:...

for(all components of this object (this-o)){

if(this-o ==NULL){

pnew-o=NULL;

}else if(this-o 未被复制){

//复制本组件中的每一个元件

pnew-o = this-o-clone();

}else{

pnew-o = this-o 的复制品;

}

return pnew;

}

为判断组件 o 是否已经被复制应该在组件 o 中加一个标志cloned,cloned为真表示已经被复制。 为找到组件 o 的复制品应该在组件 o

中保存复制品的地址 pclone。

this-cloned=true;

this-pclone=pnew;

...

if(this-o == NULL)

pnew-o=NULL;

}else if(this-o-cloned==false){

//复制本组件中的每一个元件

pnew-o = this-o-clone();

}else{

pnew-o = this-o-pclone;

}注意,执行一次clone操作后必须将cloned置false.

当然还有其它方法表示是否已经复制.class Node{

static int Cloned=0;

int cloned=0;

...

virtual Node * clone(){

...

if(cloned==Cloned){

//已经复制

...

}else{

//未复制

...

}

...

}

public:

Node * clone_for_call(){

Cloned++;

return clone();

}

...

}

如果Cloned不溢出,就有对每个结点node,node.cloned<=Cloned(已经复制时取等号)。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有