栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

最近在写游戏,就以地图类模版为例说明如何模拟多维数组吧!
复制代码 代码如下:
    template
    class CMap
    {
    public:
        CMap(IN UINT row_num, IN UINT col_num,
                  IN T_CELL_STYLE cell_style = static_cast(0));

        // 下标操作符重载
        typename vector::iterator operator[](IN UINT x);

    public:
        const UINT m_ROW_NUM;    // 地图网格行数
        const UINT m_COL_NUM;    // 地图网格列数
    private:
        vector _m_map_data;    // 存放地图数据

    };

我们知道下标操作符重载不能编写成如下形式:
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 myMap(_MAP_ROW, _MAP_COL, _CELL_GROUND);
    // 获取地图第3行第5列单元格样式
    vector::iterator iter = myMap[3];
    CELLSTYLE aCell = iter[5];

我们将上面两个下标操作表达式联立,如下:
CELLSTYLE aCell myMap[3][5];

这样就得到了双下标操作,看起来就像操作二维数组。好了,让我们来看一下如何重载。
复制代码 代码如下:
    template
    inline typename vector::iterator
    CMap::operator[](IN UINT x)
    {
        if (m_ROW_NUM <= x)
        {
            overflow_error e("overflow - CMap::operator[]");
            throw(e);
        }
        return _m_map_data.begin() + x * m_COL_NUM;
    }

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/66212.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号