用列舉定義有意義的陣列下標

2021-04-13 09:05:59 字數 1654 閱讀 5146

在開發中,經常會用到一些陣列,它裡面存放一定數量(已知,不是太多)的特定元素。在使用數字表示的陣列下標訪問陣列中元素的時候,根本不知道該元素是否是需要的那個元素,而且使**可讀性降低,甚至還會出現下標越界的危險。

比如,現在有如下的繼承體系:

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,或者對其將以改進,將數...