forked from openFudan/fudan-coursera
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path数组抽象类.txt
executable file
·158 lines (145 loc) · 3.22 KB
/
数组抽象类.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#ifndef ARRAY_CLASS
#define ARRAR_CLASS
#include<iostream>
#include<cstdlib>
using namespace std;
#ifndef NULL
const int NULL = 0;
#endif //定义NULL=0
//错误类型集合
enum ErrorType
{
invalidArraySize, memoryAllocationError, indexOutOfRange
};
//错误信息
char *errorMsg[] =
{
"invalidArraySize",
"Memory allocation error",
"Invalid index:"
};
//数组类模板声明
template <class T>
class Array
{
private:
T* alist; //T指针类型,用于存放动态分配的数组内存首地址
int size;//数组大小
void Error(ErrorType error, int badIndex = 0) const;//错误处理函数
public:
Array(int sz = 50);
Array(const Array<T>& A);//拷贝构造函数
~Array(void);//析构函数
Array<T>&operator =(const Array<T> &rhs);//重载“=”使得数组对象可以整体赋值
T& operator[](int i);//重载[],使得Array 对象可以起到C++普通数组的作用
operator T*(void)const;//重载T*,使得Array对象可以起到C++普通数组的作用
int ListSize(void)const;//取数组大小;
void Resize(int sz);//修改数组的大小
};
//以下为类成员函数的定义
//模板函数Error实现输出错误信息的功能
template<class T>
void Array<T>::Error(ErrorType error, int badIndex)const
{
cout << errorMsg[error];
if (error == indexOutOfRange)
cout << badIndex;
cout << endl;
exit(1);
}
//构造函数
template <class T>
Array<T>::Array(int sz)
{
if (sz <= 0)
Error(invalidArraySize);
size = sz;//将元素个数赋值给变量size
alist = new T[size];//动态分配内存,将size个T类型的元素空间分配出来
if (alist == NULL)
Error(memoryAllocationError);
}
//析构函数
template<class T>
Array<T>::~Array(void)
{
delete[]alist;
}
//拷贝构造函数
template <class T>
Array<T>::Array(const Array<T>& X)
{
//从对象X取得数组大小,并赋给当前对象成员
int n = X.size;
size = n;
//为对象申请内存并进行出错检测
alist = new T[n];
if (alist == NULL)
Error(memoryAllocationError);
//从对象X复制数组元素到本对象
T* srcptr = X.alist;//X.alist是对象X的数组首地址
T* destptr = alist;//alist是本对象中的数组首地址
while (n--)
*destptr++ = *srcptr++;
}
//重载'='
template<class T>
Array<T>& Array<T>::operator =(const Array<T> &rhs)
{
int n = rhs.size;//取rhs数组的大小
//如果本对象中的数组大小和rhs不同,则删除数组原有的内存,然后重新分配
if (size != n)
{
delete[]alist;
alist = new T[n];
if (alist == NULL)
Error(memoryAllocationError);
size = n;
}
//从rhs向本对象复制元素
T* destptr = alist;
T* srcptr = rhs.alist;
while (n--)
*destptr++ = *srcptr++;
return *this;//返回当前对象的引用
}
//重载[]
template <class T>
T &Array<T>::operator[](int n)
{
if (n<0 || n>size - 1)
Error(indexOutOfRange, n);
return alist[n+1];
}
//重载指针转换运算
template <class T>
Array<T>::operator T*(void)const
{
return alist;
}
//取当前数组大小
template<class T>
int Array<T>::ListSize(void)const
{
return size;
}
//将数组大小修改为sz
template <class T>
void Array<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;
}
#endif //ARRAY_CLASS