DynamicList
生活随笔
收集整理的這篇文章主要介紹了
DynamicList
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
文章目錄
- 1 繼承關(guān)系圖和接口實(shí)現(xiàn)
- 2 代碼實(shí)現(xiàn)
- 3 順序存儲線性表的分析
1 繼承關(guān)系圖和接口實(shí)現(xiàn)
DynamicList設(shè)計(jì)要點(diǎn):
當(dāng)前類當(dāng)然是類模板
- 申請連續(xù)堆空間作為順序存儲空間
- 動態(tài)設(shè)置順序存儲空間的大小
- 保證重置順序存儲空間時的異常安全性
函數(shù)異常安全的概念:
- 不泄露任何資源
- 不允許破壞數(shù)據(jù)
函數(shù)異常安全的基本保證:
如果異常被拋出,對象內(nèi)的任何成員仍然保持有效狀態(tài),并且沒有數(shù)據(jù)的破壞及資源泄露。
DynamicList接口實(shí)現(xiàn):
template < typename T > class DynamicList : public SeqList<T> { protected:int m_capacity; // 順序存儲空間的大小public:DynamicList(int capacity); // 申請空間int capacity() const;void resize(int capacity); // 重新設(shè)置存儲空間的大小~DynamicList(); // 歸還空間 };DynamicList繼承類圖:
2 代碼實(shí)現(xiàn)
DynamicList.h
#ifndef DYNAMICLIST_H #define DYNAMICLIST_H#include "Seqlist.h" #include "Exception.h"namespace LemonLib {template < typename T > class DynamicList : public SeqList<T> { protected:int m_capacity;public:DynamicList(int capacity){this->m_array = new T[capacity];if (this->m_array != NULL){this->m_length = 0;m_capacity = capacity;}else{THROW_EXCEPTION(NoEnoughMemoryException, "No enough memory to new DynamicList object...");}}int capacity() const{return m_capacity;}void resize(int capacity){if (capacity != m_capacity){T* array = new T[capacity];if (array != NULL){int len = (this->m_length < capacity) ? this->m_length : capacity;for (int i=0; i<len; i++){array[i] = this->m_array[i]; /* 賦值發(fā)生異常時,捕獲異常后,當(dāng)前對象仍然是可用的,保證了異常安全 */}T* temp = this->m_array;this->m_array = array;this->m_length = len;this->m_capacity = capacity;delete[] temp; /* 之所以最后才delete是為了防止delete時調(diào)用析構(gòu)函數(shù),*//* 而析構(gòu)函數(shù)中拋出異常導(dǎo)致當(dāng)前對象構(gòu)造不完全 *//* 保證異常安全 */}}}~DynamicList(){delete[] this->m_array;} };}#endif // DYNAMICLIST_H測試代碼main.cpp
#include <iostream> #include "Object.h" #include "Exception.h" #include "List.h" #include "Seqlist.h" #include "Staticlist.h" #include "Dynamiclist.h"using namespace std; using namespace LemonLib;int main() {DynamicList<int> sl(5);for (int i=0; i<sl.capacity(); i++){sl.insert(0, i);}for (int i=0; i<sl.length(); i++){cout << sl[i] << endl;}sl.remove(3);for (int i=0; i<sl.length(); i++){cout << sl[i] << endl;}try{sl[5] = 0;}catch (const Exception& e){cout << e.message() << endl;cout << e.location() << endl;}return 0; }3 順序存儲線性表的分析
下面的代碼是否正確?
void func() {DynamicList<int> d1(5);DynamicList<int> d2 = d1; // copy assignmentfor (int i=0; i<d1.capacity(); i++){d1.insert(i, i);d2.insert(i, i*i);}for (int i=0; i<d1.length(); i++){cout << d1[i] << endl;} }分析: 上面的代碼是有很大的問題的。DynamicList<int> d2 = d1這句話是實(shí)際上是進(jìn)行了拷貝構(gòu)造,顯然這里是淺拷貝。那么,d1和d2的m_array將會指向同一片堆空間,那么d2進(jìn)行的操作將會覆蓋d1進(jìn)行的操作。
解決辦法: 對于容器類型的類,可以考慮禁用拷貝構(gòu)造和賦值操作(直接在List類中進(jìn)行相關(guān)處理即可)。
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的DynamicList的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 任务间资源共享问题示例
- 下一篇: 继承关系中的拷贝构造函数和赋值操作重载函