模板智能數組指針 1.管理任意類型的數組指針 2.釋放的時候自動刪除數組指針指向的記憶體 //模板智能數組指針 template<typename T> class AiArrayPtr { public: AiArrayPtr(T *pArray) { m_pAiPtr = pArray; m_bI ...
模板智能數組指針
1.管理任意類型的數組指針
2.釋放的時候自動刪除數組指針指向的記憶體
//模板智能數組指針 template<typename T> class AiArrayPtr { public: AiArrayPtr(T *pArray) { m_pAiPtr = pArray; m_bIsMyPtr =true;//是自己管理的指針 m_nSize = GetArraySize(pArray);//計算數組在記憶體中的個數 } ~AiArrayPtr(){ if(m_pAiPtr && m_bIsMyPtr)//指針不為空並且是自己管理的指針 { delete[] m_pAiPtr; m_pAiPtr=nullptr; } } private: T* m_pAiPtr; //保存數組指針 bool m_bIsMyPtr; //是否自己刪除數組指針 int m_nSize; //數組大小 };
3.通過指針計算數組中的個數
//通過指針獲取數組個數 int GetArraySize(const T *pArray)const { const char* pname = typeid(T).name(); //獲得類型名稱 int s = 0; //檢查是否是結構體sturct 或是類class if (strstr(pname, "struct") || strstr(pname, "class")) { s = *((size_t*)pArray - 1); //獲取對象數組個數 } else { s = _msize(pArray) / sizeof(T); //獲取內置數據數組個數 } return s; }
3.要有指針的樣式和數組的樣式
//重載->運算符 const AiArrayPtr* operator->()const { return this; } //重載[]運算符 T operator[](int index) { if (index < 0 || index >= m_nSize) { throw(TEXT("數組越界")); return T(); } return *(m_pAiPtr + index); }
4.支持for範圍查詢和迭代器
//AiArrayPtr的類中類迭代器 class iterator { private: T* m_pCur; //當前指針數據 public: iterator(T* pCur) :m_pCur(pCur) {} T operator*() { //迭代器解引用 return *m_pCur; } iterator& operator++() { //前置++運算符 m_pCur++; return *this; } iterator& operator++(int) { //後置++運算符 m_pCur++; return *this; } bool operator==(iterator const& it)const { //==運算符 return m_pCur == it.m_pCur; } bool operator!=(iterator const &it)const { //!=運算符 return !(*this == it); } }; //在AiArrayPtr類實現bigin()和end()函數 iterator begin()const { //範圍開始 return iterator(m_pAiPtr); } iterator end()const { //範圍結束 return iterator(m_pAiPtr + m_nSize); }
5.實例用法
AiArrayPtr<int> pint = new int[3]{ 4,5,6 };
int nSize=pint->GetSize();//指針樣式用法
int n = pint[2];//數組樣式用法 for (const int &v : pint)//支持新的for範圍查詢 { OutString(TEXT("V= %d"), v); }
//支持以前的for範圍查詢 for (AiArrayPtr<int>::iterator it = pint->begin(); it != pint->end(); it++) { OutString(TEXT("V= %d"), *(it)); }
簽名:GreenLeaf1976