国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

下標操作符重載模擬多維數組詳解

2020-01-26 15:51:47
字體:
來源:轉載
供稿:網友

最近在寫游戲,就以地圖類模版為例說明如何模擬多維數組吧!

復制代碼 代碼如下:

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

看到了吧,是不是很簡單,中間過程借用了一個具有下標操作能力的類類型成員。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 阳山县| 郴州市| 高唐县| 封丘县| 长岭县| 唐山市| 荔浦县| 苏州市| 栾城县| 兰考县| 盐亭县| 贺兰县| 安庆市| 云梦县| 常熟市| 鄂托克旗| 会同县| 莱阳市| 沐川县| 鸡西市| 松江区| 仙游县| 东台市| 霍州市| 乐山市| 思茅市| 舒城县| 乐平市| 都江堰市| 辽阳市| 射阳县| 吉木萨尔县| 赤壁市| 张家港市| 银川市| 南宁市| 柳河县| 紫金县| 白水县| 罗城| 抚宁县|