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