📄 array2_t.h
字号:
#pragma once
template<typename T>
class array2_T
{
public:
//创建一个空的二维数组
array2_T(void);
//创建一个二维数组,内容为0
array2_T(unsigned int nRow, unsigned int nCol);
//创建一个二维数组,如果bFreeMem为真,就拷贝数据,否则,只给指针复制
array2_T(unsigned int nRow, unsigned int nCol, T *data, bool bFreeMem);
//深层拷贝一个二维数组
array2_T(const array2_T& source);
//析构并释放空间
~array2_T(void);
//赋值运算符的重载(深层)
array2_T& operator = (const array2_T& source);
//重载[]
T* operator [](unsigned int n);
//对象清0
void clear();
public:
unsigned int m_nRow;
unsigned int m_nCol;
bool m_bFreeMem;
T *m_data;
};
template<typename T>
array2_T<T>::array2_T(void)
{
m_nRow = 0;
m_nCol = 0;
m_bFreeMem = false;
m_data = NULL;
}
template<typename T>
array2_T<T>::array2_T(unsigned int nRow, unsigned int nCol) : m_nRow(nRow), m_nCol(nCol)
{
m_bFreeMem = true;
m_data = new T[m_nRow * m_nCol];
memset((void*)m_data, 0, sizeof(T)*m_nRow*m_nCol);//数据清0
}
template<typename T>
array2_T<T>::array2_T(unsigned int nRow, unsigned int nCol, T *data, bool bFreeMem)
: m_nRow(nRow), m_nCol(nCol), m_data(data), m_bFreeMem(bFreeMem)
{
if (bFreeMem)
{
m_data = new T[m_nRow * m_nCol];
for (unsigned int i=0; i<m_nRow*m_nCol; ++nCol)
{
m_data[i] = data[i];//保存数据,不用memcpy,因为T可能包含指针成员
}
}
}
template<typename T>
array2_T<T>::array2_T(const array2_T& source)
{
m_nRow = source.m_nRow;
m_nCol = source.m_nCol;
m_bFreeMem = true;
m_data = new T[m_nRow * m_nCol];
for (unsigned int i=0; i<m_nRow*m_nCol; ++nCol)
{
m_data[i] = data[i];//保存数据,不用memcpy,因为T可能包含指针成员
}
}
template<typename T>
array2_T<T>::~array2_T(void)
{
clear();
}
template<typename T>
array2_T<T>& array2_T<T>::operator = (const array2_T& source)
{
//1.检查自赋值
if(this == &source) return *this;
//2.释放
clear();
//3.拷贝数据
m_nRow = source.m_nRow;
m_nCol = source.m_nCol;
m_bFreeMem = true;
m_data = new T[m_nRow * m_nCol];
for (unsigned int i=0; i<m_nRow*m_nCol; ++nCol)
{
m_data[i] = data[i];//保存数据,不用memcpy,因为T可能包含指针成员
}
//4.返回自身引用
return *this;
}
template<typename T>
T* array2_T<T>::operator [](unsigned int n)
{
return m_data + n * m_nCol;
}
template<typename T>
void array2_T<T>::clear()
{
if(m_bFreeMem && m_data!=NULL)
{
delete []m_data;
}
memset((void*)this, 0, sizeof(*this));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -