求助C++程序修改
要求:动态数组(Dynamic Array)类的封装CDArray.cpp如下:#include <iostream>
#include <string.h>
#include "CDArray.h"
using namespace std;
//===================实现初始化=============================
template<class DataType>
void CDArray<DataType>::Init()
{
m_pData=NULL;
m_nSize=0;
m_nMax=0;
}
//==================实现缺省构造函数========================
template<class DataType>
CDArray<DataType>::CDArray()
{
CDArray::Init();
cout<<"创建动态数组"<<endl;
}
//==================重载构造函数========================
template<class DataType>
CDArray<DataType>::CDArray(int nSize, DataType dValue)
{
int i;
m_nSize=nSize;
m_nMax=2*m_nSize;
DataType* _m_pData=new DataType[m_nMax];
if( m_pData == NULL )
{
cout<<"no enough memory!"<<endl;
exit(1);
}
cout<<"创建动态数组"<<endl;
for(i=0;i<nSize;i++)
{
m_pData[i]=dValue;
}
}
//===============实现拷贝构造函数==========================
template<class DataType>
CDArray<DataType>::CDArray(const CDArray& array)
{
m_nSize=array.m_nSize;
m_nMax=2*m_nSize;
m_pData=new DataType[m_nMax];
memcpy(m_pData,array.m_pData,m_nSize*sizeof(DataType));
}
//==================实现释放动态内存========================
template<class DataType>
void CDArray<DataType>::Free()
{
delete [] m_pData;
CDArray::Init();
}
//====================实现析构函数==========================
template<class DataType>
CDArray<DataType>::~CDArray()
{
CDArray::Free();
cout<<"已释放动态数组"<<endl;
}
//===============用内联函数实现判断数组下标的合法性===========
template<class DataType>
int CDArray<DataType>::InvalidateIndex(int nIndex)
{
if(nIndex<0||nIndex>=m_nSize)
{
cout<<"index error!"<<'\n';
return 0;
}
else
return nIndex;
}
//======================显示数组所有元素======================
template<class DataType>
void CDArray<DataType>::Print(void)
{
int i;
for(i=0;i<m_nSize;i++)
{
cout<<"m_pData["<<i<<"]="<<m_pData[i]<<endl;
}
}
//=======================实现获取数组大小======================
template<class DataType>
int CDArray<DataType>::GetSize()
{
return m_nSize;
}
//========================实现重置数组大小======================
template<class DataType>
int CDArray<DataType>::SetSize(int nSize)
{
int i;
m_pData=(DataType*)realloc(m_pData,nSize*sizeof(DataType));
if(nSize>m_nSize)
{
for(i=m_nSize;i<nSize;i++) m_pData[i]=0;
}
m_nSize=nSize;
return m_nSize;
}
//====================获取某个元素=============================
template<class DataType>
double CDArray<DataType>::GetAt(int nIndex)
{
if(nIndex<0||nIndex>=m_nSize)
{
cout<<"index error!"<<endl;
return 0.0;
}
else
{
return m_pData[nIndex];
}
}
//====================设置某个元素的值============================
template<class DataType>
int CDArray<DataType>::SetAt(int nIndex,DataType dValue)
{
if(nIndex<0||nIndex>=m_nSize)
{
cout<<"index error!"<<endl;
return 0;
}
else
{
m_pData[nIndex]=dValue;
}
return 1;
}
//=================追加一个新的元素到数组末尾===========================
template<class DataType>
int CDArray<DataType>::PushBack(DataType dValue)
{
m_nSize++;
m_pData=(DataType*)realloc(m_pData,m_nSize*sizeof(DataType));
if(m_pData == NULL)
{
cout<<"空间不够,追加新元素到数组末尾失败"<<endl;
return 0;
}
m_pData[m_nSize-1]=dValue;
return 1;
}
//====================从数组中删除一个元素==========================
template<class DataType>
int CDArray<DataType>::DeleteAt(int nIndex)
{
int i;
if(nIndex<0||nIndex>=m_nSize)
{
cout<<"index error!"<<endl;
return 0;
}
m_nMax=2*m_nSize;
m_nSize--;
DataType* _m_pData=new DataType[m_nMax];
for(i=0;i<nIndex;i++)
{
_m_pData[i]=m_pData[i];
}
for(i=nIndex;i<m_nSize;i++)
{
_m_pData[i]=m_pData[i+1];
}
m_pData=(DataType*)realloc(m_pData,m_nSize*sizeof(DataType));
memcpy(m_pData,_m_pData,m_nSize*sizeof(DataType));
delete []_m_pData;
return 1;
}
//====================插入一个新的元素到数组中==========================
template<class DataType>
int CDArray<DataType>::InsertAt(int nIndex,DataType dValue)
{
int i;
if(nIndex<0||nIndex>=m_nSize)
{
cout<<"index error!"<<endl;
return 0;
}
m_nSize+=1;
m_nMax=2*m_nSize;
m_nSize++;
DataType* _m_pData=new DataType[m_nMax];
for(i=0;i<nIndex;i++)
{
_m_pData[i]=m_pData[i];
}
_m_pData[nIndex]=dValue;
for(i=nIndex+1;i<m_nSize;i++)
{
_m_pData[i]=m_pData[i-1];
}
m_pData=(DataType*)realloc(m_pData,m_nSize*sizeof(DataType));
if(m_pData == NULL)
{
cout<<"空间不够,增加新元素到数组失败"<<endl;
return 0;
}
memcpy(m_pData,_m_pData,m_nSize*sizeof(DataType));
delete []_m_pData;
return 1;
}
//===================重载赋值操作符号"="=======================
template<class DataType>
CDArray& CDArray<DataType>::operator = (const CDArray &array)
{
if(this == &array)
{
return *this;
}
m_nSize=array.m_nSize;
m_nMax=2*m_nSize;
DataType* _m_pData=new DataType[m_nMax];
//DataType *_m_pData=(DataType*)malloc( m_nSize * sizeof(DataType));
memcpy(_m_pData,array.m_pData,m_nSize*sizeof(DataType));
delete []m_pData;
m_pData=_m_pData;
return *this;
}
CDArray.h如下:#include <stdio.h>
#include <stdlib.h>
#include <typeinfo.h>
#include <string.h>
template <class DataType>
class CDArray
{
private:
DataType *m_pData; // 存放数组的动态内存指针
int m_nSize; // 数组的元素个数
int m_nMax; // 预留给动态数组的内存大小
private:
void Init(); // 初始化
void Free(); // 释放动态内存
inline int InvalidateIndex(int nIndex); // 判断下标的合法性
public:
CDArray(); // 缺省构造函数
CDArray(int nSize, DataType dValue = 0); // 其他构造函数,设置一定数组大小,并设置所有元素为0;当然还可以定义其他不同参数的构造函数,以方便用户使用
CDArray(const CDArray& array); // 拷贝构造函数(最好为所有包含动态分配成员的类都提供拷贝构造函数)
~CDArray(); // 析构函数
void Print(); // 输出显示所有数组元素的值
int GetSize(); // 获取数组大小(元素个数)
int SetSize(int nSize); // 重新设置数组的大小。注:若nSize小于原数组大小,可截断取前nSize个元素作为新数组的元素;若nSize大于原数组大小,新增的元素的值设置缺省值0即可
DataType GetAt(int nIndex); // 获取某个元素
DataType operator[] (int nIndex) const; // 重载[]操作符,以便像传统数组那样通过a[k]来获取元素值
int SetAt(int nIndex, DataType dValue); // 设置某个元素的值
int PushBack(DataType dValue); // 追加一个新的元素到数组末尾
int DeleteAt(int nIndex); // 从数组中删除一个元素
int InsertAt(int nIndex, DataType dValue); // 插入一个新的元素到数组中
CDArray &CDArray::operator = (const CDArray& array); // 重载赋值操作符号"="
};
//其他:
#define SAFEDELETE(p) if(p) {delete p; p=NULL;}
#define SAFEDELETES(p) if(p) {delete [] p; p=NULL;}
//===================实现初始化=============================
template<class DataType>
void CDArray<DataType>::Init()
{
m_pData=NULL;
m_nSize=0;
m_nMax=0;
}
//==================实现缺省构造函数========================
template<class DataType>
CDArray<DataType>::CDArray()
{
CDArray<DataType>::Init();
cout<<"创建动态数组"<<endl;
}
//==================重载构造函数========================
template<class DataType>
CDArray<DataType>::CDArray(int nSize, DataType dValue)
{
int i;
m_nSize=nSize;
m_nMax=2*m_nSize;
DataType *_m_pData=new DataType[m_nMax];
if( m_pData == NULL )
{
cout<<"no enough memory!"<<endl;
exit(1);
}
cout<<"创建动态数组"<<endl;
for(i=0;i<nSize;i++)
{
m_pData[i]=dValue;
}
}
//===============实现拷贝构造函数==========================
template<class DataType>
CDArray<DataType>::CDArray(const CDArray& array)
{
m_nSize=array.m_nSize;
m_nMax=2*m_nSize;
m_pData=new DataType[m_nMax];
memcpy(m_pData,array.m_pData,m_nSize*sizeof(DataType));
}
//==================实现释放动态内存========================
template<class DataType>
void CDArray<DataType>::Free()
{
delete [] m_pData;
CDArray<DataType>::Init();
}
//====================实现析构函数==========================
template<class DataType>
CDArray<DataType>::~CDArray()
{
CDArray<DataType>::Free();
cout<<"已释放动态数组"<<endl;
}
//===============用内联函数实现判断数组下标的合法性===========
template<class DataType>
int CDArray<DataType>::InvalidateIndex(int nIndex)
{
if(nIndex<0||nIndex>=m_nSize)
{
cout<<"index error!"<<'\n';
return 0;
}
else
return nIndex;
}
//======================显示数组所有元素======================
template<class DataType>
void CDArray<DataType>::Print(void)
{
int i;
for(i=0;i<m_nSize;i++)
{
cout<<"m_pData["<<i<<"]="<<m_pData[i]<<endl;
}
}
//=======================实现获取数组大小======================
template<class DataType>
int CDArray<DataType>::GetSize()
{
return m_nSize;
}
//========================实现重置数组大小======================
template<class DataType>
int CDArray<DataType>::SetSize(int nSize)
{
int i;
m_pData=(DataType*)realloc(m_pData,nSize*sizeof(DataType));
if(nSize>m_nSize)
{
for(i=m_nSize;i<nSize;i++) m_pData[i]=0;
}
m_nSize=nSize;
return m_nSize;
}
//====================获取某个元素=============================
template<class DataType>
double CDArray<DataType>::GetAt(int nIndex)
{
if(nIndex<0||nIndex>=m_nSize)
{
cout<<"index error!"<<endl;
return 0.0;
}
else
{
return m_pData[nIndex];
}
}
//====================设置某个元素的值============================
template<class DataType>
int CDArray<DataType>::SetAt(int nIndex,DataType dValue)
{
if(nIndex<0||nIndex>=m_nSize)
{
cout<<"index error!"<<endl;
return 0;
}
else
{
m_pData[nIndex]=dValue;
}
return 1;
}
//=================追加一个新的元素到数组末尾===========================
template<class DataType>
int CDArray<DataType>::PushBack(DataType dValue)
{
m_nSize++;
m_pData=(DataType*)realloc(m_pData,m_nSize*sizeof(DataType));
if(m_pData == NULL)
{
cout<<"空间不够,追加新元素到数组末尾失败"<<endl;
return 0;
}
m_pData[m_nSize-1]=dValue;
return 1;
}
//====================从数组中删除一个元素==========================
template<class DataType>
int CDArray<DataType>::DeleteAt(int nIndex)
{
int i;
if(nIndex<0||nIndex>=m_nSize)
{
cout<<"index error!"<<endl;
return 0;
}
m_nMax=2*m_nSize;
m_nSize--;
DataType *_m_pData=new DataType[m_nMax];
for(i=0;i<nIndex;i++)
{
_m_pData[i]=m_pData[i];
}
for(i=nIndex;i<m_nSize;i++)
{
_m_pData[i]=m_pData[i+1];
}
m_pData=(DataType*)realloc(m_pData,m_nSize*sizeof(DataType));
memcpy(m_pData,_m_pData,m_nSize*sizeof(DataType));
delete []_m_pData;
return 1;
}
//====================插入一个新的元素到数组中==========================
template<class DataType>
int CDArray<DataType>::InsertAt(int nIndex,DataType dValue)
{
int i;
if(nIndex<0||nIndex>=m_nSize)
{
cout<<"index error!"<<endl;
return 0;
}
m_nSize+=1;
m_nMax=2*m_nSize;
m_nSize++;
DataType *_m_pData=new DataType[m_nMax];
for(i=0;i<nIndex;i++)
{
_m_pData[i]=m_pData[i];
}
_m_pData[nIndex]=dValue;
for(i=nIndex+1;i<m_nSize;i++)
{
_m_pData[i]=m_pData[i-1];
}
m_pData=(DataType*)realloc(m_pData,m_nSize*sizeof(DataType));
if(m_pData == NULL)
{
cout<<"空间不够,增加新元素到数组失败"<<endl;
return 0;
}
memcpy(m_pData,_m_pData,m_nSize*sizeof(DataType));
delete []_m_pData;
return 1;
}
//===================重载赋值操作符号"="=======================
template<class DataType>
CDArray& CDArray<DataType>::operator = (const CDArray &array)
{
if(this == &array)
{
return *this;
}
m_nSize=array.m_nSize;
m_nMax=2*m_nSize;
DataType *_m_pData=new DataType[m_nMax];
//double *_m_pData=(double*)malloc( m_nSize * sizeof(double));
memcpy(_m_pData,array.m_pData,m_nSize*sizeof(DataType));
delete []m_pData;
m_pData=_m_pData;
return *this;
}
main如下:void 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();
}