程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 下標操作符重載模仿多維數組詳解

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

編輯:關於C++

下標操作符重載模仿多維數組詳解。本站提示廣大學習愛好者:(下標操作符重載模仿多維數組詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是下標操作符重載模仿多維數組詳解正文


比來在寫游戲,就以地圖類模版為例解釋若何模仿多維數組吧!

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

看到了吧,是否是很簡略,中央進程借用了一個具有下標操作才能的類類型成員。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved