【轉】用枚舉定義有意義的數組下標

原始日期:數組

2016-12-09 19:51ide

 

In development, some arrays will be used frequently, which stores inside certain quantity (known, not many) of specific elements. When using the array index represented by figures to access elements in the array, I know anything but this element is whether the element we need, which reduces the readability of the code, and even there will be risk of subscript in bounds.this

在開發中,常常會用到一些數組,它裏面存放必定數量(已知,不是太多)的特定元素。在使用數字表示的數組下標訪問數組中元素的時候,根本不知道該元素是不是須要的那個元素,並且使代碼可讀性下降,甚至還會出現下標越界的危險。
       好比,如今有以下的繼承體系:spa

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
{
    eSqure,
    eRectangle,
    eCircle,
    eEllipse,
    eShapeCount
};
       數組定義和賦值使用下面的代碼:
CShape* arrShape[eShapeCount];

arrShape[eSquare] = new CSquare();
arrShape[eRectangle] = new CRectangle();
arrShape[eCircle] = new CCircle();
arrShape[eEllipse] = new CEllipse();
       這樣每次要獲得一個橢圓的對象指針的時候,可使用arrShape[eEllipse]來訪問。經過eEllipse這個有意義的數組下標,該數組元素指針所指的對象一目瞭然。
       若是對數組的訪問都使用這種方法,就能夠有效的避免數組下標越界的錯誤。

       另外,這種方法使數組有很好的可擴展性。若是在這個繼承體系中加入了其餘子類,只要在枚舉中eShapeCount前面加上相應的項便可,數組定義的代碼根本不用修改(固然不能忘了添加數組元素賦值的代碼)。.net

本文轉載自此博客http://blog.csdn.net/cp32212116/article/details/40819885指針

相關文章
相關標籤/搜索