#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; }
有问题欢迎继续追问,满意请及时结贴,谢谢