用枚举定义有意义的数组下标
来源:互联网 发布:西安财经行知学院宿舍 编辑:程序博客网 时间:2024/05/27 09:46
在开发中,经常会用到一些数组,它里面存放一定数量(已知,不是太多)的特定元素。在使用数字表示的数组下标访问数组中元素的时候,根本不知道该元素是否是需要的那个元素,而且使代码可读性降低,甚至还会出现下标越界的危险。
比如,现在有如下的继承体系:
现在需要一个数组来存放每种形状的对象的指针。最简单的就是使用下面的代码定义数组并给数组元素赋值:
这样的代码当然没有什么问题。
可是每次要得到一个长方形的对象指针的时候,都要用arrShape[1]来访问。这样的代码可读性非常差:如果不看前面的数组赋值代码,根本不可能知道arrShape[1]里面存放的是什么。
而且,一不小心就会写错数组下标而导致下标越界的错误。C++在编译阶段是不检查下标越界的,所以下标越界的错误只会在运行时被暴露出来。如果出现错误的代码跟定义数组和给数组元素赋值的代码相隔较远的话,查找起来也比较麻烦。
另外,这段代码的扩展性也很差:如果在这个继承体系中加入了三角形,那么数组定义和给数组元素赋值的代码都要修改。
有什么好方法避免上面所说到的种种缺点吗?当然有,那就是用枚举定义有意义的数组下标。
针对上面的例子,可以定义出如下的一个枚举类型:
数组定义和赋值使用下面的代码:
这样每次要得到一个椭圆的对象指针的时候,可以使用arrShape[eEllipse]来访问。通过eEllipse这个有意义的数组下标,该数组元素指针所指的对象一目了然。
如果对数组的访问都使用这种方法,就可以有效的避免数组下标越界的错误。
另外,这种方法使数组有很好的可扩展性。如果在这个继承体系中加入了其他子类,只要在枚举中eShapeCount前面加上相应的项即可,数组定义的代码根本不用修改(当然不能忘了添加数组元素赋值的代码)。
比如,现在有如下的继承体系:
class CShape;
class CSquare : public CShape;
class CRectangle : public CShape;
class CCircle : public CShape;
class CEllipse : public 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[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
};
{
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[eSquare] = new CSquare();
arrShape[eRectangle] = new CRectangle();
arrShape[eCircle] = new CCircle();
arrShape[eEllipse] = new CEllipse();
如果对数组的访问都使用这种方法,就可以有效的避免数组下标越界的错误。
另外,这种方法使数组有很好的可扩展性。如果在这个继承体系中加入了其他子类,只要在枚举中eShapeCount前面加上相应的项即可,数组定义的代码根本不用修改(当然不能忘了添加数组元素赋值的代码)。
- 用枚举定义有意义的数组下标
- 用枚举定义有意义的数组下标
- 用枚举定义有意义的数组下标
- 用枚举定义有意义的数组下标
- 用枚举定义有意义的数组下标
- 用枚举定义有意义的数组下标
- 【good】用枚举定义有意义的数组下标
- C语言定义数组时使用枚举作为数组的下标
- 用枚举类型作为数组下标
- 枚举类型作数组下标
- enum 枚举 在 数组下标的 一个用法
- php将数组的下标从新定义自增 array_values
- 用枚举值作下标
- Vector用数组下标访问的条件
- 数组的下标应用
- 数组下标的本质
- VBScript的数组下标
- 数组下标的排序
- 和老婆认识五周年
- 程序员成功之路(二) ——The road ahead for programmer
- 程序员成功之路(三) ——The road ahead for programmer
- 销售三境界
- 程序员分成几种不同的境界
- 用枚举定义有意义的数组下标
- java前辈感言
- 程序员保持健康的生活指南
- 关于读书
- HTML标记
- 快捷键(2)
- ServletContext和ServletConfig深度分析
- 思维要有极强的穿透力,学会看透文献作者没有写出来的动机。
- 同一段视频