這個(gè)例子可以看做是對(duì)STL容器設(shè)計(jì)從頭到尾的一種討論,我承認(rèn)到最后版本也和STL中的容器有很大的差距,但是我們發(fā)現(xiàn)在這樣的討論有利于我們更進(jìn)一步的對(duì)STL的設(shè)計(jì)有更深一步的了解。首先,假設(shè)我們想把一個(gè)堆類放到一個(gè)數(shù)組中,例如是一些表示不同類型的交通工具,當(dāng)然不同的交通工具在這里都派生之一個(gè)基礎(chǔ)類:
等等,所有派生之Vehicle類都必須實(shí)現(xiàn)這些虛擬函數(shù)否則無(wú)法實(shí)例化。
現(xiàn)在想對(duì)這些交通工具進(jìn)行管理把它放在一個(gè)數(shù)組中如下:
當(dāng)然這里有一個(gè)嚴(yán)重的問(wèn)題,error C2259: 'Vehicle' : cannot instantiate abstract class due to following members: Vehicle有多個(gè)的純虛函數(shù)這里是無(wú)法實(shí)例化的,即使可以這里的x其實(shí)是被裁剪了就退化成Vehicle了,并不是我們所想的讓他實(shí)現(xiàn)動(dòng)態(tài)聯(lián)編。這是初學(xué)的時(shí)候經(jīng)常碰到的一些小問(wèn)題,可以通過(guò)指針解決。
這樣一來(lái)就可以解決動(dòng)態(tài)聯(lián)編的問(wèn)題了,同時(shí)也出現(xiàn)了新的問(wèn)題,這里的x是局部變量當(dāng)x的生命周期到了的時(shí)候,那么Parking_lot[/* */]什么也不是了。有人也提出了用動(dòng)態(tài)申請(qǐng)的方法,Parking_lot[num_vehiles++] = new Automoblie(x);但是申請(qǐng)的這塊內(nèi)存該由誰(shuí)來(lái)釋放呢!一個(gè)好的解決辦法就是通過(guò)代理讓它了管理內(nèi)存的釋放問(wèn)題。這里在每個(gè)類中都加入一個(gè)拷貝自己的函數(shù)。如下:
建立一個(gè)代理類如下:
這個(gè)類中有一個(gè)指向交通工具的指針T* vp,就可以用來(lái)存放任何一個(gè)派生至Vehicle的類,可以建立一個(gè)數(shù)組:
在往parking_lot放東西時(shí),用copy函數(shù)進(jìn)行動(dòng)態(tài)的分配一個(gè)對(duì)象,這個(gè)動(dòng)態(tài)對(duì)象的釋放是由VehicleSurrogate來(lái)管理的,不用自己操心,不會(huì)引起內(nèi)存的泄露問(wèn)題。下面看看VehicleSurrogate類的實(shí)現(xiàn):
這里我想說(shuō)的是,這個(gè)類的實(shí)現(xiàn)和專業(yè)的STL容器是有一定的差距的,每次給容器放東西的時(shí)候都有調(diào)用copy來(lái)new一個(gè)類,這樣的操作有點(diǎn)浪費(fèi)時(shí)間了。代碼