
/**//**********************************************************************************
自定義CArray模板類:動態數組類
*/
template <class T>
class CMyArray 

{
public:
//構造
CMyArray(int num=4)
{
m_data=new T[num];
m_count=0;
m_Size=num;
}
//析構
virtual ~CMyArray()
{
if(m_data)
delete [] m_data;
}
//方法
public:
int Add(T &data);
T& operator []( int nIndex );
T GetAt( int nIndex ) const;
void SetAt( int nIndex, T &data );
void RemoveAt( int nIndex, int nCount = 1 );
int GetSize( ) const
{ return m_count;}
private:
void ReAlloc();
//屬性
private:
T *m_data;
int m_Size;//Array總的尺寸:=largest index+1
int m_count;//當前內容
};
/**//**************************************************************************
幾個重要方法的實現部分
*/
template <class T>
int CMyArray<T>::Add(T &data)

{
if(m_count>=m_Size)
{
ReAlloc();
}
m_data[m_count++]=data;
return m_count;
}
//重新分配內存
template <class T>
void CMyArray<T>::ReAlloc()

{
int len=m_Size*2+1;
T *p=new T[len];//擴展了一倍內存
memcpy(p,m_data,m_Size*sizeof(T));
delete m_data;
m_data=p;
m_Size=len;
}
//重載
template <class T>
T& CMyArray<T>::operator [](int nIndex)

{
assert(nIndex<m_count || nIndex>0);
return m_data[nIndex];
}
//得值
template <class T>
T CMyArray<T>::GetAt( int nIndex ) const

{
assert(nIndex<m_count || nIndex>0);
return m_data[nIndex];
}
//設值
template <class T>
void CMyArray<T>::SetAt(int nIndex, T &data)

{
assert(nIndex<m_Size || nIndex>0);
m_data[nIndex]=data;
}
//移除
template <class T>
void CMyArray<T>::RemoveAt(int nIndex, int nCount)

{
assert(nIndex+nCount-1<m_count ||nIndex>0 );
memcpy(m_data+nIndex,m_data+nIndex+nCount,(m_count-nIndex-nCount)*sizeof(T));
m_count--;
}
