时间:2021-05-19
最近在写游戏,就以地图类模版为例说明如何模拟多维数组吧!
复制代码 代码如下:
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; // 存放地图数据
};
我们知道下标操作符重载不能编写成如下形式:
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;
}
看到了吧,是不是很简单,中间过程借用了一个具有下标操作能力的类类型成员。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
一、什么是操作符重载操作符重载可以分为两部分:“操作符”和“重载”。说到重载想必都不陌生了吧,这是一种编译时多态,重载实际上可以分为函数重载和操作符重载。运算符
操作符的重载有一些规则:1.重载操作符必须具有一个类类型或枚举类型操作数。这条规则强制重载操作符不能重新定义用于内置类型对象的操作符的含义。如:intopera
本文实例讲述了Python中操作符重载用法。分享给大家供大家参考,具体如下:类可以重载python的操作符操作符重载使我们的对象与内置的一样。__X__的名字的
前言这篇文章将对C++中复制构造函数和重载赋值操作符进行总结,包括以下内容:1.复制构造函数和重载赋值操作符的定义;2.复制构造函数和重载赋值操作符的调用时机;
new、delete(new[]、delete[])操作符的重载需要注意:1.重载的new、delete(或者new[]、delete[])操作符必须是类的静态