下標(biāo)操作符重載模擬多維數(shù)組詳解
最近在寫(xiě)游戲,就以地圖類(lèi)模版為例說(shuō)明如何模擬多維數(shù)組吧!
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));
// 下標(biāo)操作符重載
typename vector<T_CELL_STYLE>::iterator operator[](IN UINT x);
public:
const UINT m_ROW_NUM; // 地圖網(wǎng)格行數(shù)
const UINT m_COL_NUM; // 地圖網(wǎng)格列數(shù)
private:
vector<T_CELL_STYLE> _m_map_data; // 存放地圖數(shù)據(jù)
}; /* class CMap */
我們知道下標(biāo)操作符重載不能編寫(xiě)成如下形式:
T_CELL_STYLE operator[][](IN UINT x, IN UINT y);
雖然不能直接實(shí)現(xiàn)一對(duì)下標(biāo)操作符重載,但是我們可以間接模擬。
思路是這樣的,先通過(guò)單下標(biāo)操作返回一個(gè)具有下標(biāo)操作能力的左值,對(duì)左值進(jìn)行下標(biāo)操作,兩個(gè)下標(biāo)操作表達(dá)式聯(lián)立就實(shí)現(xiàn)了雙下標(biāo)操作。先看如下示例:
// 地圖尺寸
#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];
我們將上面兩個(gè)下標(biāo)操作表達(dá)式聯(lián)立,如下:
CELLSTYLE aCell myMap[3][5];
這樣就得到了雙下標(biāo)操作,看起來(lái)就像操作二維數(shù)組。好了,讓我們來(lái)看一下如何重載。
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;
}
看到了吧,是不是很簡(jiǎn)單,中間過(guò)程借用了一個(gè)具有下標(biāo)操作能力的類(lèi)類(lèi)型成員。
相關(guān)文章
C++函數(shù)參數(shù)匹配規(guī)則示例小結(jié)
這篇文章主要介紹了C++函數(shù)參數(shù)匹配規(guī)則,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08一篇文章帶你了解C語(yǔ)言文件操作中的幾個(gè)函數(shù)
這篇文章主要介紹了使用C語(yǔ)言操作文件的基本函數(shù)整理,包括創(chuàng)建和打開(kāi)以及關(guān)閉文件的操作方法,需要的朋友可以參考下,希望能夠給你帶來(lái)幫助2021-09-09C語(yǔ)言數(shù)據(jù)結(jié)構(gòu) 棧的基礎(chǔ)操作
這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu) 棧的基礎(chǔ)操作的相關(guān)資料,需要的朋友可以參考下2017-05-05C++利用鏈表寫(xiě)一個(gè)簡(jiǎn)單的棧實(shí)例詳解
這篇文章主要介紹了C++利用鏈表寫(xiě)一個(gè)簡(jiǎn)單的棧實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-05-05C++實(shí)現(xiàn)選擇性排序(SelectionSort)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)選擇性排序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04C語(yǔ)言實(shí)現(xiàn)學(xué)生打卡系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)學(xué)生打卡系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12C語(yǔ)言實(shí)現(xiàn)設(shè)備管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)設(shè)備管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06