首页 > 编程 > C > 正文

实例说明下标操作符重载模拟多维数组

2020-02-24 14:29:57
字体:
来源:转载
供稿:网友

相信很多程序员在开发的时候,都会遇到瓶颈的时候,这个时候我们要怎么处理呢?网上查询信息?但是很多知识在网络上是没办法查找到的,今天武林技术频道小编为大家带来实例说明下标操作符重载模拟多维数组

 

    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;
    }

 以上就是武林技术频道小编介绍的关于实例说明下标操作符重载模拟多维数组,其实这个介绍对于初级程序员应该是很需要的,希望大家可以分配好时间进行学习哦。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选