Освой самостоятельно С++ за 21 день.
Шрифт:
104: for (int i = 0: i<size; i++)
105: pType[i] = 0;
106: }
107:
108: int& Array::operator[] (int offSet)
109: {
110: int size = GetitsSize;
111: if (offSet >= 0 && offSet < GetitsSize)
112: return pType[offSet];
113: throw xBoundary;
114: return pType[0];
115: }
116:
117: const int& Array::operator[] (int offSet) const
118: {
119: int size = GetitsSize;
120: if (offSet >= 0 && offSet < GetitsSize)
121: return pType[offSet];
122: throw xBoundary;
123: return pType[0];
124: }
125:
126: int main
127: {
128:
129: try
130: {
131: Array intArray(9);
132: for (int j = 0: j< 100; j++)
133: {
134: intArray[j] - j;
135: cout << "intArray[" << j << "] okay...\n";
136: }
137: }
138: catch (Array::xBoundary)
139: {
140: cout << "Unable to process your input!\n";
141: }
142: catch (Array;:xSize& theExoeption)
143: {
144: theException.PrintError;
145: }
146: catch (...)
147: {
148: cout << "Something went wrong!\n";
149: }
150: cout << "Done.\n";
151: return 0;
152: }
Результат:
Too small! Received: 9
Done.
Анализ:
В строке 142 объявляется объект исключения, который является ссылкой. При вызове функции PrintError со ссылкой на объект благодаря полиморфизму вызывается нужная версия функции PrintError. В результате программный код становится яснее, проще для понимания, а следовательно, и для дальнейшей поддержки.
Исключения и шаблоны
При создании исключений, предназначенных для работы с шаблонами, есть два варианта решений. Можно создавать исключение прямо в шаблоне, и тогда они будут доступны для каждого экземпляра шаблона, а можно использовать классы исключений, созданные вне объявления шаблона. Оба этих подхода показаны в листинге 20.6.
Листинг 20.6. Использование исключений с шаблонами
1: #include <iostream.h>
2:
3: const int DefaultSize = 10;
4: class xBoundary { } ;
5:
6: template <class T>
7: class Array
8: {
9: public:
10: // конструкторы
11: Array(int itsSize = DefaultSize);
12: Array(const Array &rhs);
13: ~Array { delete [] pType;}
14:
15: // операторы
16: Array& operator=(const Array<T>&);
17: T& operator[](int offSet);
18: const T& operator[](int offSet) const;
19:
20: // методы доступа
21: int GetitsSize const { return itsSize; }
22:
23: // функция-друг
24: friend ostream& operator<< (ostream&, const Array<T>&);
25:
26: // определение классов исключений
27:
28: class xSize { };
29:
30: private:
31: int *pType;
32: int itsSize;
33: };
34:
35: template <class T>
36: Array<T>::Array(int size):
37: itsSize(size)
38: {
39: if (size <10 || size > 30000)
40: throw xSize;
41: рТуре = new T[size];
42: for (int i = 0; i<size; i++)
43: pType[i] = 0;
44: }
45:
46: template <class T>
47: Array<T>& Array<T>::operator=(const Array<T> &rhs)
48: {
49: if (this == &rhs)
50: return *this;
51: delete [] рТуре;
52: itsSize = rhs.GetitsSize;
53: рТуре = new T[itsSize];
54: for (int i = 0; i<itsSize; i++)
55: pType[i] = rhs[i];
56: }
57: template <class T>
58: Array<T>::Array(const Array<T> &rhs)
59: {
60: itsSize = rhs.GetitsSize;
61: рТуре = new T[itsSize];
62: for (int i = 0; i<itsSize; i++)
63: pType[i] = rhs[i];
64: }
65:
66: template <class T>
67: T& Array<T>::operator[](int offSet)
68: {
69: int size = GetitsSize;
70: if (offSet >= 0 && offSet < GetitsSize)
71: return pType[offSet];
72: throw xBoundary:
73: return pType[0];
74: }
75:
76: template <class T>
77: const T& Array<T>::operator[](int offSet) const
78: {
79: int mysize = GetitsSize;
80: if (offSet >= 0 && offSet < GetitsSize)
81: return pType[offSet];