⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 array2_t.h

📁 一个二维数组
💻 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 + -