国产探花免费观看_亚洲丰满少妇自慰呻吟_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;
    }

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

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

圖片精選

主站蜘蛛池模板: 绥化市| 嵩明县| 日土县| 吉林省| 古交市| 精河县| 建平县| 云和县| 应城市| 新余市| 拜泉县| 广平县| 吉林市| 鄯善县| 江都市| 静宁县| 凤山县| 长泰县| 集贤县| 砀山县| 广平县| 密山市| 确山县| 临泽县| 铁岭市| 青田县| 阜城县| 黄大仙区| 黄浦区| 汉川市| 朝阳县| 武山县| 庆安县| 湾仔区| 恩施市| 洛隆县| 广安市| 恩施市| 明溪县| 明溪县| 云林县|