模板智慧陣列指標
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)); }