????????我們?cè)谏瞎?jié)博客中說到,在 SeqList 下又可以衍生出 StaticList 和 DynamicList兩個(gè)子類。那么我們今天就來看看這兩個(gè)子類,它們是如何實(shí)現(xiàn)的以及它們之間有何區(qū)別。
創(chuàng)新互聯(lián)業(yè)務(wù)包括:成品網(wǎng)站、企業(yè)產(chǎn)品展示型網(wǎng)站建設(shè)、高端網(wǎng)站設(shè)計(jì)、電子商務(wù)型網(wǎng)站建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)公司(多語言)、商城建設(shè)、按需策劃、成都全網(wǎng)營銷推廣等。效率優(yōu)先,品質(zhì)保證,用心服務(wù)是我們的核心價(jià)值觀,我們將繼續(xù)以良好的信譽(yù)為基礎(chǔ),秉承穩(wěn)固與發(fā)展、求實(shí)與創(chuàng)新的精神,為客戶提供更全面、更優(yōu)質(zhì)的互聯(lián)網(wǎng)服務(wù)!
????????A、StaticList的設(shè)計(jì)要點(diǎn):首先必須是一個(gè)類模板。其次是使用原生數(shù)組作為順序存儲(chǔ)空間,最后是使用模板參數(shù)決定數(shù)組大小。定義如下
template? class?StaticList?:?public?SeqList{ protected: ????T?m_space[N];????????????//?順序存儲(chǔ)空間,N?為模板參數(shù) public: ????StaticList();????????????//?指定父類成員的具體值 ????int?capacity()?const; };
????????我們下來來實(shí)現(xiàn) StaticList ,代碼如下
StaticList.h 源碼
#ifndef?STATICLIST_H #define?STATICLIST_H #include?"Seqlist.h" namespace?DTLib { template? class?StaticList?:?public?SeqList{ protected: ????T?m_space[N];???//?順序存儲(chǔ)空間,N?為模板參數(shù) public: ????StaticList()????//?指定父類成員的具體值 ????{ ????????this->m_array?=?m_space; ????????this->m_length?=?0; ????} ????int?capacity()?const ????{ ????????return?N; ????} }; } #endif?//?STATICLIST_H
????????我們來寫個(gè)測試代碼測試下這個(gè) StaticList ,main.cpp 代碼如下
#include?#include?"StaticList.h" using?namespace?std; using?namespace?DTLib; int?main() { ????StaticList ?l; ????for(int?i=0;?i ????????我們來看看輸出結(jié)果
????????結(jié)果正是我們想要的,這個(gè) StaticList 類已經(jīng)實(shí)現(xiàn)完畢。接下來我們?cè)賮韺?shí)現(xiàn) DynamicList 類。
????????B、DynamicList類的設(shè)計(jì)要點(diǎn):它也必須得是一個(gè)類模板。申請(qǐng)連續(xù)堆空間作為順序存儲(chǔ)空間;動(dòng)態(tài)設(shè)置順序存儲(chǔ)空間的大小;保證重置順序存儲(chǔ)空間時(shí)的異常安全性。
????????????a> 函數(shù)異常安全的概念:1、不泄露任何資源;2、不允許破壞數(shù)據(jù)。
????????????b> 函數(shù)異常安全的基本保證,如果對(duì)象被拋出:對(duì)象內(nèi)的任何成員仍然能保持有效狀態(tài);沒有數(shù)據(jù)的破壞及資源泄漏。
????????下來我們來看看它的定義
template? class?DynamicList?:?public?SeqList{ protected: ????int?m_capacity;????//?順序存儲(chǔ)空間的大小 public: ????DynamicList(int?capacity);????//?申請(qǐng)空間 ????int?capacity()?const; ???? ????//?重新設(shè)置順序存儲(chǔ)空間的大小 ????void?resize(int?capacity); ????~DynamicList();????//?歸還空間 }; ????????下來我們來實(shí)現(xiàn)這個(gè) DynamicList 類
DynamicList.h 源碼
#ifndef?DYNAMICLIST_H #define?DYNAMICLIST_H #include?"SeqList.h" #include?"Exception.h" namespace?DTLib { template? class?DynamicList?:?public?SeqList{ protected: ????int?m_capacity;?????//?順序存儲(chǔ)空間的大小 public: ????DynamicList(int?capacity)???//?申請(qǐng)空間 ????{ ????????this->m_array?=?new?T[capacity]; ????????if(?this->m_array?!=?NULL?) ????????{ ????????????this->m_length?=?0; ????????????this->m_capacity?=?capacity; ????????} ????????else ????????{ ????????????THROW_EXCEPTION(NoEnoughMemoryException,?"No?memory?to?create?DynamicList?..."); ????????} ????} ????int?capacity()?const ????{ ????????return?m_capacity; ????} ????void?resize(int?capacity) ????{ ????????if(?this->m_capacity?!=?capacity?) ????????{ ????????????T*?array?=?new?T[capacity]; ????????????if(?array?!=?NULL?) ????????????{ ????????????????int?length?=?(this->m_length?m_length?:?capacity; ????????????????for(int?i=0;?i m_array[i]; ????????????????} ????????????????T*?temp?=?this->m_array; ????????????????this->m_array?=?array; ????????????????this->m_length?=?length; ????????????????this->m_capacity?=?capacity; ????????????????delete[]?temp; ????????????} ????????????else ????????????{ ????????????????THROW_EXCEPTION(NoEnoughMemoryException,?"No?memory?to?resize?DynamicList?Object?..."); ????????????} ????????} ????} ????~DynamicList() ????{ ????????delete[]?this->m_array; ????} }; } #endif?//?DYNAMICLIST_H ????????我們同樣還是寫個(gè)示例代碼來驗(yàn)證下這個(gè) DynamicList 類,main.cpp 代碼如下
#include?#include?"DynamicList.h" using?namespace?std; using?namespace?DTLib; int?main() { ????DynamicList ?l(5); ????for(int?i=0;?i ????????我們來看看編譯結(jié)果
????????結(jié)果已經(jīng)正確輸出了。那么回到我們之前的問題:是否能將 DynamicList 作為 StaticList 的子類實(shí)現(xiàn)呢?答案肯定是不行的,因?yàn)?DynamicList 和 StaticList 兩個(gè)類在存儲(chǔ)結(jié)構(gòu)上完全是不同的。因此他們是等價(jià)的,所以不能將 DynamicList 作為 StaticList 的子類實(shí)現(xiàn)。通過今天對(duì) DynamicList 和StaticList 的學(xué)習(xí),總結(jié)如下:1、StaticList 通過模板參數(shù)定義順序存儲(chǔ)空間;2、DynamicList 通過動(dòng)態(tài)內(nèi)存申請(qǐng)定義順序存儲(chǔ)空間;3、DynamicList 支持動(dòng)態(tài)重置順序存儲(chǔ)空間的大?。?、DynamicList 中的 resize() 函數(shù)實(shí)現(xiàn)需要保證異常安全。
文章題目:StaticList和DynamicList(七)
網(wǎng)頁URL:http://weahome.cn/article/jjdgep.html