手机
当前位置:查字典教程网 >编程开发 >C语言 >下标操作符重载模拟多维数组详解
下标操作符重载模拟多维数组详解
摘要:最近在写游戏,就以地图类模版为例说明如何模拟多维数组吧!复制代码代码如下:templateclassCMap{public:CMap(INU...

最近在写游戏,就以地图类模版为例说明如何模拟多维数组吧!

复制代码 代码如下:

template <typename T_CELL_STYLE>

class CMap

{

public:

CMap(IN UINT row_num, IN UINT col_num,

IN T_CELL_STYLE cell_style = static_cast<T_CELL_STYLE>(0));

// 下标操作符重载

typename vector<T_CELL_STYLE>::iterator operator[](IN UINT x);

public:

const UINT m_ROW_NUM; // 地图网格行数

const UINT m_COL_NUM; // 地图网格列数

private:

vector<T_CELL_STYLE> _m_map_data; // 存放地图数据

}; /* class CMap */

我们知道下标操作符重载不能编写成如下形式:

T_CELL_STYLE operator[][](IN UINT x, IN UINT y);

虽然不能直接实现一对下标操作符重载,但是我们可以间接模拟。

思路是这样的,先通过单下标操作返回一个具有下标操作能力的左值,对左值进行下标操作,两个下标操作表达式联立就实现了双下标操作。先看如下示例:

复制代码 代码如下:

// 地图尺寸

#define _MAP_ROW 30

#define _MAP_COL 36

// 地图单元格样式

typedef enum {

_CELL_GROUND,

_CELL_GRASS,

_CELL_BRICK,

_CELL_STEEL,

_CELL_WATER

} CELLSTYLE;

CMap<CELLSTYLE> myMap(_MAP_ROW, _MAP_COL, _CELL_GROUND);

// 获取地图第3行第5列单元格样式

vector<T_CELL_STYLE>::iterator iter = myMap[3];

CELLSTYLE aCell = iter[5];

我们将上面两个下标操作表达式联立,如下:

CELLSTYLE aCell myMap[3][5];

这样就得到了双下标操作,看起来就像操作二维数组。好了,让我们来看一下如何重载。

复制代码 代码如下:

template <typename T_CELL_STYLE>

inline typename vector<T_CELL_STYLE>::iterator

CMap<T_CELL_STYLE>::operator[](IN UINT x)

{

if (m_ROW_NUM <= x)

{

overflow_error e("overflow - CMap<T_CELL_STYLE>::operator[]");

throw(e);

}

return _m_map_data.begin() + x * m_COL_NUM;

}

看到了吧,是不是很简单,中间过程借用了一个具有下标操作能力的类类型成员。

【下标操作符重载模拟多维数组详解】相关文章:

c++ 一个二进制串转化为整数的解决方法

c语言字符数组与字符串的使用详解

深入第K大数问题以及算法概要的详解

C++中对象的赋值与复制操作详细解析

生成随机数rand函数的用法详解

C++中不能被重载的运算符介绍

C++中函数的默认参数详细解析

求子数组最大和的解决方法详解

C++ 模版双向链表的实现详解

C++结构体数组详细解析

精品推荐
分类导航