源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

下标操作符重载模拟多维数组详解

  • 时间:2021-03-24 21:06 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:下标操作符重载模拟多维数组详解
最近在写游戏,就以地图类模版为例说明如何模拟多维数组吧!
[u]复制代码[/u] 代码如下:
    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); 虽然不能直接实现一对下标操作符重载,但是我们可以间接模拟。 思路是这样的,先通过单下标操作返回一个具有下标操作能力的左值,对左值进行下标操作,两个下标操作表达式联立就实现了双下标操作。先看如下示例:
[u]复制代码[/u] 代码如下:
    // 地图尺寸     #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]; 这样就得到了双下标操作,看起来就像操作二维数组。好了,让我们来看一下如何重载。
[u]复制代码[/u] 代码如下:
    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;     }
看到了吧,是不是很简单,中间过程借用了一个具有下标操作能力的类类型成员。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部