在開發中,經常會用到一些陣列,它裡面存放一定數量(已知,不是太多)的特定元素。在使用數字表示的陣列下標訪問陣列中元素的時候,根本不知道該元素是否是需要的那個元素,而且使**可讀性降低,甚至還會出現下標越界的危險。
比如,現在有如下的繼承體系:
class
cshape;
class
csquare :
public
cshape;
class
crectangle :
public
cshape;
class
ccircle :
public
cshape;
class
cellipse :
public
cshape;
現在需要乙個陣列來存放每種形狀的物件的指標。最簡單的就是使用下面的**定義陣列並給陣列元素賦值:
cshape
*arrshape[4];
arrshape[0]
=new
csquare();
arrshape[1]
=new
crectangle();
arrshape[2]
=new
ccircle();
arrshape[3]
=new
cellipse();
這樣的**當然沒有什麼問題。
可是每次要得到乙個長方形的物件指標的時候,都要用arrshape[1]來訪問。這樣的**可讀性非常差:如果不看前面的陣列賦值**,根本不可能知道arrshape[1]裡面存放的是什麼。
而且,一不小心就會寫錯陣列下標而導致下標越界的錯誤。c++在編譯階段是不檢查下標越界的,所以下標越界的錯誤只會在執行時被暴露出來。如果出現錯誤的**跟定義陣列和給陣列元素賦值的**相隔較遠的話,查詢起來也比較麻煩。
另外,這段**的擴充套件性也很差:如果在這個繼承體系中加入了三角形,那麼陣列定義和給陣列元素賦值的**都要修改。
有什麼好方法避免上面所說到的種種缺點嗎?當然有,那就是用列舉定義有意義的陣列下標。
針對上面的例子,可以定義出如下的乙個列舉型別:
enum
shapeindex;
陣列定義和賦值使用下面的**:
cshape
*arrshape[eshapecount];
arrshape[esquare]
=new
csquare();
arrshape[erectangle]
=new
crectangle();
arrshape[ecircle]
=new
ccircle();
arrshape[eellipse]
=new
cellipse();
這樣每次要得到乙個橢圓的物件指標的時候,可以使用arrshape[eellipse]來訪問。通過eellipse這個有意義的陣列下標,該陣列元素指標所指的物件一目了然。
如果對陣列的訪問都使用這種方法,就可以有效的避免陣列下標越界的錯誤。
另外,這種方法使陣列有很好的可擴充套件性。如果在這個繼承體系中加入了其他子類,只要在列舉中eshapecount前面加上相應的項即可,陣列定義的**根本不用修改(當然不能忘了新增陣列元素賦值的**)。
用列舉定義有意義的陣列下標
在開發中,經常會用到一些陣列,它裡面存放一定數量 已知,不是太多 的特定元素。在使用數字表示的陣列下標訪問陣列中元素的時候,根本不知道該元素是否是需要的那個元素,而且使 可讀性降低,甚至還會出現下標越界的危險。比如,現在有如下的繼承體系 class cshape class csquare publ...
有意義的開始
今天真的是很值得紀念的一天,來深圳第一次過得這麼充實。原因很簡單有希望 有盼頭 第一次主動約mm出去玩 好像不是約會,是兩位兄弟幫忙約的,呵呵,再次感謝兩位好兄弟的幫助 值得紀念。一直比較膽小,尤其是現在這種處境,完全沒有什麼信心,自己真是太膽小了,總是想著兩位兄弟幫忙打頭陣,為自己鋪路,好像不大好...
有意義的編碼
現象描述 使用有意義的編碼作為一條記錄的id,甚至作為資料庫的主鍵存在,例如,乙個員工的編碼設定為0203004,其中02代表員工所在分公司,03代表員工所在部門,004代表員工進入到該部門的序號。原因分析 id的設定方式大概有以下幾種,一種是純粹的流水號,從1開始,每次加1,或者對其將以改進,將數...