用枚举定义有意义的数组下标
2009-11-26 10:09
337 查看
在开发中,经常会用到一些数组,它里面存放一定数量(已知,不是太多)的特定元素。在使用数字表示的数组下标访问数组中元素的时候,根本不知道该元素是否是需要的那个元素,而且使代码可读性降低,甚至还会出现下标越界的危险。
比如,现在有如下的继承体系:
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前面加上相应的项即可,数组定义的代码根本不用修改(当然不能忘了添加数组元素赋值的代码)。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1780619
比如,现在有如下的继承体系:
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前面加上相应的项即可,数组定义的代码根本不用修改(当然不能忘了添加数组元素赋值的代码)。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1780619
相关文章推荐
- 用枚举定义有意义的数组下标
- 用枚举定义有意义的数组下标
- 【转】用枚举定义有意义的数组下标
- 用枚举定义有意义的数组下标
- 【good】用枚举定义有意义的数组下标
- 用枚举定义有意义的数组下标
- C语言定义数组时使用枚举作为数组的下标
- GCC中运用枚举定义数组的实例
- 结构体中最后一个成员数组定义0个元素的意义
- 如何定义带下标的js数组
- 数组下标为-1的意义
- 迭代器学习之二:数组的可枚举类型和枚举数的定义以及编译器的foreach工作原理
- 关于ImageView定义数组,索引下标递增求余的原因分析
- 定义一个10元素的数组,给其赋值,每个值等于其下标,输出;然后倒排序再输出
- iOS 定义具有位移操作的枚举的意义
- 宏和枚举有什么区别,定义数组时使用枚举和使用宏的区别
- php将数组的下标从新定义自增 array_values
- 实验6 数组1 定义一个3×3的整形二维数组arr,为数组各元素赋值,找出最小值以及它的行下标和列下标,并输出该矩阵
- enum 枚举 在 数组下标的 一个用法
- 枚举类型作数组下标