在上一篇《[]運算子的重載和二維數組類的[][]運算子多載》中討論了[]運算子的重載以及通過兩次重載的疊加使得二維數組類可以用 a[i][j] 的形式訪問。上一篇重點研究運算子的重載,所以代碼是示範性質,一維數組類和二維數組類的實現和C/C++的內建數群組類型相比差別不大,沒有什麼特別的優點。而且二維數組類使用了指標的指標,這也使得代碼可讀性不好。如果把一維數組改為變長的,即聲明執行個體後可以隨時改變大小的話,那麼二維數組中只用指標就行了,不需要使用指標的指標。對上一篇中的代碼進行一些修改,去掉了一維數組的實現,直接用MFC的CWordArray,並且不再用指標的指標,而改由用指標來工作,代碼清晰了很多,二維數組實現為可變長度的,比原來更具有實用價值。代碼如下:
-----------------------------------------------------------------------------------------------
//二維WORD數組
class C2DimWordArr
{
private:
CWordArray *m_p;//主指標
long m_row,m_column;//行數,列數。
public:
C2DimWordArr()
{
m_p=NULL;
}
void SetSize(long row,long column)
{
if (NULL!=m_p){delete[] m_p;m_p=NULL;}
m_p=new CWordArray[row];
for (long i=0;i<row;i++)
m_p[i].SetSize(column);
m_row=row;
m_column=column;
}
CSize GetSize()
{
return CSize(m_row,m_column);
}
~C2DimWordArr()
{
if (NULL!=m_p){delete[] m_p;m_p=NULL;}
}
CWordArray& operator[](long idx)
{
return m_p[idx];
}
};
-----------------------------------------------------------------------------------------------
測試代碼(環境:VC++6,Win32 EXE對話方塊工程):
-----------------------------------------------------------------------------------------------
C2DimWordArr c2dwa;c2dwa.SetSize(4,3);
long i,j;
for (i=0;i<4;i++)
for (j=0;j<3;j++)
c2dwa[i][j]= i*10 + j ;
CString s,stmp;
for (i=0;i<4;i++)
for (j=0;j<3;j++)
{
stmp.Format("[%d][%d] = %d /n", i,j,c2dwa[i][j]) ;
s+=stmp;
}
AfxMessageBox(s);
s="";
c2dwa.SetSize(2,9);
CSize siz= c2dwa.GetSize();
for (i=0;i<siz.cx ;i++)
for (j=0;j<siz.cy ;j++)
c2dwa[i][j]= i*10 + j ;
for (i=0;i<siz.cx ;i++)
for (j=0;j<siz.cy ;j++)
{
stmp.Format("[%d][%d] = %d /n", i,j,c2dwa[i][j]) ;
s+=stmp;
}
AfxMessageBox(s);
-----------------------------------------------------------------------------------------------
在這個寫法的基礎上,只要再進行擴充,就可以完成更多更複雜的任務,比如可以在重新分配大小的時候保持原來的資料,訪問元素的時候進行越界檢查,疏鬆陣列等等。