MyArray类实现:
//动态数组类模板实现
#ifndef __MY_ARRAY__
#define __MY_ARRAY__
#include <iostream>
//#include <stdlib.h>
#ifndef NULL
const int NULL = 0;
#endif //NULL
enum ErrorType
{
invalidArraySize,
memoryAllocationError,
indexOutOfRange,
};
char* errorMsg[] =
{
"Invalid array size",
"Memory allocation error",
"Invalid index:",
};
template <class T>
class MyArray
{
public:
MyArray(int sz = 50);
MyArray(const MyArray<T>& A);
~MyArray(void);
MyArray<T>& operator= (const MyArray<T>& rhs); //A = B
T& operator[](int i); //A[1] = 0;
operator T*(void) const; //???
int arraySize(void) const;
void reSize(int sz);
private:
T* alist;
int size;
void Error(ErrorType error, int badIndex = 0) const;
};
template <class T>
MyArray<T>::MyArray(int sz /* = 50 */)
{
if ( sz <= 0 )
{
Error(invalidArraySize);
}
size = sz;
alist = new T[size];
if(alist == NULL)
Error(memoryAllocationError);
}
//浅拷贝 (指针的拷贝) //析构时会出现问题
// template <class T>
// MyArray<T>::MyArray(const MyArray<T>& A)
// {
// size = A.size;
// alist = A.alist;
// }
//深拷贝 (内容的拷贝)
template <class T>
MyArray<T>::MyArray(const MyArray<T>& A)
{
int n = A.size;
size = n;
alist = new T[n];
if (!alist)
{
Error(memoryAllocationError);
}
T* srcptr = A.alist;
T* destprt = alist;
while (n--)
{
*destprt++ = *srcptr++;
}
};
template <class T>
MyArray<T>::~MyArray(void)
{
delete []alist;
}
template <class T>
MyArray<T>& MyArray<T>::operator=(const MyArray<T>& rhs)
{
int n = rhs.size;
if (size != n)
{
delete []alist;
alist = new T[n];
if (alist == NULL)
{
Error(memoryAllocationError);
}
size = n;
}
T* destptr = alist;
T* srcptr = rhs.alist;
while (n--)
{
*destptr++ = *srcptr++;
}
return *this;
}
template <class T>
T& MyArray<T>::operator[](int n)
{
if( n<0 || n>size-1 )
{
Error(indexOutOfRange, n);
}
return alist[n];
}
template <class T>
MyArray<T>::operator T*(void) const
{
return alist;
}
template <class T>
int MyArray<T>::arraySize(void) const
{
return size;
}
template <class T>
void MyArray<T>::reSize(int sz)
{
if (sz <= 0)
Error(invalidArraySize);
if (sz == size)
return;
T* newlist = new T[sz];
if(newlist ==NULL)
Error(memoryAllocationError);
int n = (sz <= size) ? sz : size;
T* srcptr = alist;
T* destptr = newlist;
while (n--)
*destptr++ = *srcptr++;
delete []alist;
alist = newlist;
size = sz;
}
template <class T>
void MyArray<T>::Error(ErrorType error, int badIndex /* = 0 */) const
{
cout<<errorMsg[error]; //根据错误类型,输出错误信息
if( error == indexOutOfRange )
cout<<badIndex; //越界,输出错误下标
cout<<endl;
exit(1);
}
#endif //__MY_ARRAY__
应用:输入一个数,输出其范围内的质数
// ConsoleApplication2.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
using namespace std;
#include <iomanip>
#include "MyArray.h"
int _tmain(int argc, _TCHAR* argv[])
{
MyArray<int> A(10);
int n;
int primencount = 0,i,j;
cout<<"Enter a value >= 2 as upper limit for prime numbers:";
cin>>n;
A[primencount++] = 2;
for ( i = 3; i < n; i++)
{
if(primencount == A.arraySize())
A.reSize(primencount+10);
if(i%2 == 0)
continue;
j = 3;
while (j<=i/2 && i%j!=0)
j++;
if(j>i/2)
A[primencount++] = i;
}
for (i = 0; i < primencount; i++)
{
cout<<setw(5)<<A[i];
if((i+1)%10 == 0)
cout<<endl;
}
cout<<endl;
return 0;
}