萌新求帮助~求改成template类,使动态数组能通过最下面主函数的测试

C++语言 码拜 8年前 (2016-05-12) 1034次浏览
#include<iostream>
 #include<string>
 #include <stdio.h>
 #include <stdlib.h>
 using namespace std;
 class CDArray
 {
 private:
	double *m_pData; // 存放数组的动态内存指针
	int m_nSize; // 数组的元素个数
	int m_nMax; //数组的内存空间大小
 private:
	void Init(); // 初始化 
	void Free(); // 释放动态内存
	inline int InvalidateIndex(int nIndex); // 判断下标的合法性(数组下标)
 public:
	CDArray(); // 缺省构造函数
	CDArray(int nSize, double dValue ); // 其他构造函数,设置一定数组大小,并设置全部元素为0;当然还可以定义其他不同参数的构造函数,以方便用户使用
	CDArray(const CDArray& arr); // 拷贝构造函数(最好为全部包含动态分配成员的类都提供拷贝构造函数)
	~CDArray(); // 析构函数
	void Print(); // 输出显示全部数组元素的值
	int GetSize(); // 获取数组大小(元素个数)
    int SetSize(int nSize); // 重新设置数组的大小。注:若nSize小于原数组大小,可截断取前nSize个元素作为新数组的元素;若nSize大于原数组大小,新增的元素的值设置缺省值0即可
	double GetAt(int nIndex); // 获取某个元素
	double  operator[] (int nIndex) const;  // 重载[]操作符,以便像传统数组那样通过a[k]来获取元素值
	int SetAt(int nIndex, double dValue); // 设置某个元素的值
	int Pushback(double dValue); // 追加一个新的元素到数组末尾
	int DeleteAt(int nIndex); // 从数组中删除一个元素
	int InsertAt(int nIndex, double dValue); // 插入一个新的元素到数组中
	 CDArray  &CDArray::operator = (const CDArray& array);   // 重载赋值操作符号"="
 };
void CDArray::Init()// 初始化
 {
	m_nMax = 1;
	m_nSize = 0;
	m_pData = new double[m_nMax];
 }
 void CDArray::Free()// 释放动态内存
 {
	delete []m_pData;
 }
 int CDArray::InvalidateIndex(int nIndex)
 {
	if(nIndex >= 0 && nIndex <m_nSize)
	return 0; //表示下标合法
	else
	return 1;//下标异常
 }
 CDArray::CDArray()
 {
	Init();
 }
 CDArray::CDArray(int nSize, double dValue )
 {
	dValue = 0;
	if(nSize == 0)
	{
		Init();
	}
	else
	{
		 m_nSize = nSize;
		 m_nMax = nSize * 2;
		for(int i = 0 ; i < nSize ; ++i)
		{
			m_pData[i] = dValue;
		}
	}
 }
 CDArray::CDArray( const CDArray & arr)
 {
	m_nSize = arr.m_nSize; //复制常规成员
	m_nMax = arr.m_nMax;
	m_pData = new double[m_nMax];
	std::memcpy( m_pData , arr.m_pData , (m_nMax * sizeof(double)));
 }
 CDArray::~CDArray()
 {
	CDArray::Free();
 }
 void CDArray::Print()
 {
	if(m_nSize == 0)
	{
		std::cout<<"Error : The array is empty,so it can"t be printed."<<endl;
	}
	else
	{
		for( int i = 0 ; i < m_nSize ; i++ )
		{
			std::cout<<m_pData[i]<<" ";
		}
		std::cout<<endl;
	}
 }
 int CDArray::GetSize()
 {
	return m_nSize;
 }
 int CDArray::SetSize(int nSize) //题中返回值为INT 个人认为返回值为VOID。
 {
	if( nSize < m_nSize) //截断
	{
		for(int i = m_nMax ; i < m_nSize ; i ++)
		{
			 m_pData[i] = 0;
		}
	}
	if( nSize > m_nSize && nSize <= m_nMax)//设置数组的大小未大于内存空间,仅需在后添0即可
	{
		for(int i = m_nSize ; i < nSize ; i++)
		{
			m_pData[i] = 0;
		}
	}
	if( nSize > m_nMax) //大于内存空间,需要重新分配内存空间
	{
		m_nMax = nSize; //重新分配内存空间大小
		double *temp = new double[m_nMax*sizeof(double)];//临时转存数组
		std::memcpy( temp , m_pData , (m_nSize * sizeof(double)) );//拷贝数组
		for(int  i = m_nSize ; i < nSize ; i++)
		{
			temp[i] = 0;
		}
		delete []m_pData;
		m_pData = temp;
	}
		m_nSize = nSize;
	return 0;
 }
 double CDArray::GetAt(int nIndex)
 {
	if(InvalidateIndex(nIndex))//判断下标能否合法
	{
		std::cout<<"The index is invalid."<<endl;
		exit(0);
	}
	return m_pData[nIndex];
 }
 double CDArray::operator[](int nIndex) const
 {
	if(nIndex < 0 || nIndex >= m_nSize)//判断下标能否合法
	{
		std::cout<<"The index is invalid."<<endl;
		exit(0);
	}
	return m_pData[nIndex];
 }
 int CDArray::SetAt(int nIndex, double dValue) //重新设置数组内元素的值,无需返回值
 {
	if(InvalidateIndex(nIndex))//判断下标能否合法
	{
		std::cout<<"The index is invalid."<<endl;
		exit(0);
	}
	else
	{
		m_pData[nIndex] = dValue;
	}
	return 0;
 }
 int CDArray::Pushback(double dValue)	//重新设置数组内元素的值,无需返回值
 {
	if(m_nSize < m_nMax)
	{
		m_pData[m_nSize] = dValue;	 //m_nSize++;//数组大小加1
	}
	else
	{
		m_nMax = (m_nSize + 1) * 2;	//重新分配内存空间大小
		double *temp = new double[m_nMax];	//临时转存数组
		std::memcpy( temp , m_pData , (m_nSize * sizeof(double)) );//拷贝数组
		delete []m_pData;
		m_pData = temp;
		m_pData[m_nSize] = dValue;	//数组大小加1
	}
		m_nSize++;//数组大小加1
	return 0;
 }
 int CDArray::DeleteAt(int nIndex)
 {
	if(InvalidateIndex(nIndex))//判断下标能否合法
	{
		std::cout<<"Error:The index is invalid."<<endl;
		exit(0);
	}
	else
	{
		for(int i = nIndex ; i <m_nSize ; i++) //修改后续数组
		{
			m_pData[i] = m_pData[i+1];
		}
		m_pData[m_nSize - 1] = 0 ;
		m_nSize--;
	}
	return 0;
 }
 int CDArray::InsertAt(int nIndex, double dValue)
 {
	if(nIndex < 0 || nIndex > m_nSize)	//判断下标能否合法(一开始写的程序当中判断式为nIndex >= m_nSize,这样测试代码中的类a中无法插入元素)
	{
		std::cout<<"Error: The index is invalid."<<endl;
		return 0;
	}
	if( m_nSize < m_nMax)	//数组未超过内存空间 直接插入
	{
		for(int i = (m_nSize - 1) ; i >= nIndex ; i--)
		{
			m_pData[ i + 1] = m_pData[i];
		}
		m_pData[nIndex] = dValue;
	}
	else
	{
		m_nMax = m_nSize * 2; //重新分配内存空间大小
		double *temp = new double[m_nMax];//临时转存数组
		std::memcpy( temp , m_pData , (m_nSize * sizeof(double)) );//拷贝数组
		delete []m_pData;
		m_pData = temp;

		for(int i = (m_nSize - 1) ; i >= nIndex ; i--)
		{
			m_pData[ i + 1] = m_pData[ i ];
		}
		m_pData[nIndex] = dValue;
	}
		m_nSize++;//数组大小加1
 }
 CDArray  &CDArray::operator = (const CDArray& array)
 {
	 if (&array != this)
	 {
		 this->~CDArray();
		 new (this) CDArray(array);
	 }
	 return *this;
 }
 int main()
{
CDArray<double> a;
a.InsertAt(0, 2.1);
a.Print();
a.Pushback(3.0);
a.Pushback(3.1);
a.Pushback(3.2);
a.Print();
a.DeleteAt(0);
a.Print();
a.InsertAt(0, 4.1);
a.Print();
CDArray<double> acopy = a;  //此处用到了拷贝构造函数
acopy.Print();
CDArray<double> acopy2 (a);  //该语句等同于上面的语句,都是初始化
acopy2.Print();
CDArray<double> acopy3; 
acopy3 = a;					//此处用到了赋值操作符号"="的重载
acopy3.Print();
CDArray<int> b;
b.Pushback(21);
b.Print();
b.DeleteAt(0);
b.Print();
b.Pushback(22);
b.SetSize( 5 );
b.Print();
CDArray<char> c;
c.Pushback("a");
c.Pushback("b");
c.Pushback("c");
c.InsertAt(0, "d");
c.Print();
return 0;
}
解决方案

5

直接替换,就可以了

35

#include<iostream>
#include<string>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
template<typename T>
class CDArray
{
private:
	T *m_pData; // 存放数组的动态内存指针
	int m_nSize; // 数组的元素个数
	int m_nMax; //数组的内存空间大小
private:
	void Init(); // 初始化 
	void Free(); // 释放动态内存
	inline int InvalidateIndex(int nIndex); // 判断下标的合法性(数组下标)
public:
	CDArray(); // 缺省构造函数
	CDArray(int nSize, T dValue ); // 其他构造函数,设置一定数组大小,并设置全部元素为0;当然还可以定义其他不同参数的构造函数,以方便用户使用
	CDArray(const CDArray& arr); // 拷贝构造函数(最好为全部包含动态分配成员的类都提供拷贝构造函数)
	~CDArray(); // 析构函数
	void Print(); // 输出显示全部数组元素的值
	int GetSize(); // 获取数组大小(元素个数)
	int SetSize(int nSize); // 重新设置数组的大小。注:若nSize小于原数组大小,可截断取前nSize个元素作为新数组的元素;若nSize大于原数组大小,新增的元素的值设置缺省值0即可
	double GetAt(int nIndex); // 获取某个元素
	double  operator[] (int nIndex) const;  // 重载[]操作符,以便像传统数组那样通过a[k]来获取元素值
	int SetAt(int nIndex, T dValue); // 设置某个元素的值
	int Pushback(T dValue); // 追加一个新的元素到数组末尾
	int DeleteAt(int nIndex); // 从数组中删除一个元素
	int InsertAt(int nIndex, T dValue); // 插入一个新的元素到数组中
	CDArray  &CDArray::operator = (const CDArray& array);   // 重载赋值操作符号"="
};
template<typename T>
void CDArray<T>::Init()// 初始化
{
	m_nMax = 1;
	m_nSize = 0;
	m_pData = new T[m_nMax];
}
template<typename T>
void CDArray<T>::Free()// 释放动态内存
{
	delete []m_pData;
}
template<typename T>
int CDArray<T>::InvalidateIndex(int nIndex)
{
	if(nIndex >= 0 && nIndex <m_nSize)
		return 0; //表示下标合法
	else
		return 1;//下标异常
}
template<typename T>
CDArray<T>::CDArray()
{
	Init();
}
template<typename T>
CDArray<T>::CDArray(int nSize, T dValue )
{
	dValue = 0;
	if(nSize == 0)
	{
		Init();
	}
	else
	{
		m_nSize = nSize;
		m_nMax = nSize * 2;
		for(int i = 0 ; i < nSize ; ++i)
		{
			m_pData[i] = dValue;
		}
	}
}
template<typename T>
CDArray<T>::CDArray( const CDArray & arr)
{
	m_nSize = arr.m_nSize; //复制常规成员
	m_nMax = arr.m_nMax;
	m_pData = new double[m_nMax];
	std::memcpy( m_pData , arr.m_pData , (m_nMax * sizeof(double)));
}
template<typename T>
CDArray<T>::~CDArray()
{
	CDArray<T>::Free();
}
template<typename T>
void CDArray<T>::Print()
{
	if(m_nSize == 0)
	{
		std::cout<<"Error : The array is empty,so it can"t be printed."<<endl;
	}
	else
	{
		for( int i = 0 ; i < m_nSize ; i++ )
		{
			std::cout<<m_pData[i]<<" ";
		}
		std::cout<<endl;
	}
}
template<typename T>
int CDArray<T>::GetSize()
{
	return m_nSize;
}
template<typename T>
int CDArray<T>::SetSize(int nSize) //题中返回值为INT 个人认为返回值为VOID。
{
	if( nSize < m_nSize) //截断
	{
		for(int i = m_nMax ; i < m_nSize ; i ++)
		{
			m_pData[i] = 0;
		}
	}
	if( nSize > m_nSize && nSize <= m_nMax)//设置数组的大小未大于内存空间,仅需在后添0即可
	{
		for(int i = m_nSize ; i < nSize ; i++)
		{
			m_pData[i] = 0;
		}
	}
	if( nSize > m_nMax) //大于内存空间,需要重新分配内存空间
	{
		m_nMax = nSize; //重新分配内存空间大小
		T *temp = new T[m_nMax*sizeof(T)];//临时转存数组
		std::memcpy( temp , m_pData , (m_nSize * sizeof(T)) );//拷贝数组
		for(int  i = m_nSize ; i < nSize ; i++)
		{
			temp[i] = 0;
		}
		delete []m_pData;
		m_pData = temp;
	}
	m_nSize = nSize;
	return 0;
}
template<typename T>
double CDArray<T>::GetAt(int nIndex)
{
	if(InvalidateIndex(nIndex))//判断下标能否合法
	{
		std::cout<<"The index is invalid."<<endl;
		exit(0);
	}
	return m_pData[nIndex];
}
template<typename T>
double CDArray<T>::operator[](int nIndex) const
{
	if(nIndex < 0 || nIndex >= m_nSize)//判断下标能否合法
	{
		std::cout<<"The index is invalid."<<endl;
		exit(0);
	}
	return m_pData[nIndex];
}
template<typename T>
int CDArray<T>::SetAt(int nIndex, T dValue) //重新设置数组内元素的值,无需返回值
{
	if(InvalidateIndex(nIndex))//判断下标能否合法
	{
		std::cout<<"The index is invalid."<<endl;
		exit(0);
	}
	else
	{
		m_pData[nIndex] = dValue;
	}
	return 0;
}
template<typename T>
int CDArray<T>::Pushback(T dValue)    //重新设置数组内元素的值,无需返回值
{
	if(m_nSize < m_nMax)
	{
		m_pData[m_nSize] = dValue;     //m_nSize++;//数组大小加1
	}
	else
	{
		m_nMax = (m_nSize + 1) * 2;    //重新分配内存空间大小
		T *temp = new T[m_nMax];    //临时转存数组
		std::memcpy( temp , m_pData , (m_nSize * sizeof(T)) );//拷贝数组
		delete []m_pData;
		m_pData = temp;
		m_pData[m_nSize] = dValue;    //数组大小加1
	}
	m_nSize++;//数组大小加1
	return 0;
}
template<typename T>
int CDArray<T>::DeleteAt(int nIndex)
{
	if(InvalidateIndex(nIndex))//判断下标能否合法
	{
		std::cout<<"Error:The index is invalid."<<endl;
		exit(0);
	}
	else
	{
		for(int i = nIndex ; i <m_nSize ; i++) //修改后续数组
		{
			m_pData[i] = m_pData[i+1];
		}
		m_pData[m_nSize - 1] = 0 ;
		m_nSize--;
	}
	return 0;
}
template<typename T>
int CDArray<T>::InsertAt(int nIndex, T dValue)
{
	if(nIndex < 0 || nIndex > m_nSize)    //判断下标能否合法(一开始写的程序当中判断式为nIndex >= m_nSize,这样测试代码中的类a中无法插入元素)
	{
		std::cout<<"Error: The index is invalid."<<endl;
		return 0;
	}
	if( m_nSize < m_nMax)    //数组未超过内存空间 直接插入
	{
		for(int i = (m_nSize - 1) ; i >= nIndex ; i--)
		{
			m_pData[ i + 1] = m_pData[i];
		}
		m_pData[nIndex] = dValue;
	}
	else
	{
		m_nMax = m_nSize * 2; //重新分配内存空间大小
		T *temp = new T[m_nMax];//临时转存数组
		std::memcpy( temp , m_pData , (m_nSize * sizeof(double)) );//拷贝数组
		delete []m_pData;
		m_pData = temp;
		for(int i = (m_nSize - 1) ; i >= nIndex ; i--)
		{
			m_pData[ i + 1] = m_pData[ i ];
		}
		m_pData[nIndex] = dValue;
	}
	m_nSize++;//数组大小加1
}
template<typename T>
CDArray<T>  &CDArray<T>::operator = (const CDArray& array)
{
	if (&array != this)
	{
		this->~CDArray();
		new (this) CDArray(array);
	}
	return *this;
}
int main()
{
	CDArray<double> a;
	a.InsertAt(0, 2.1);
	a.Print();
	a.Pushback(3.0);
	a.Pushback(3.1);
	a.Pushback(3.2);
	a.Print();
	a.DeleteAt(0);
	a.Print();
	a.InsertAt(0, 4.1);
	a.Print();
	CDArray<double> acopy = a;  //此处用到了拷贝构造函数
	acopy.Print();
	CDArray<double> acopy2 (a);  //该语句等同于上面的语句,都是初始化
	acopy2.Print();
	CDArray<double> acopy3; 
	acopy3 = a;                    //此处用到了赋值操作符号"="的重载
	acopy3.Print();
	CDArray<int> b;
	b.Pushback(21);
	b.Print();
	b.DeleteAt(0);
	b.Print();
	b.Pushback(22);
	b.SetSize( 5 );
	b.Print();
	CDArray<char> c;
	c.Pushback("a");
	c.Pushback("b");
	c.Pushback("c");
	c.InsertAt(0, "d");
	c.Print();
	//system("pause");
	return 0;
}

有问题欢迎继续追问,满意请及时结贴,谢谢


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明萌新求帮助~求改成template类,使动态数组能通过最下面主函数的测试
喜欢 (0)
[1034331897@qq.com]
分享 (0)