Освой самостоятельно С++ за 21 день.
Шрифт:
Листинг 20.5. Передача аргументов как ссылок u использование виртуальных функций в классах исключений
1: #include <iostream.h>
2:
3: const int DefaultSize = 10;
4:
5: class Array
6: {
7: public:
8: // конструкторы
9: Array(int itsSize = DefaultSize);
10: Array(const Array &rhs);
11: ~Array { delete [] pType;}
12:
13: // операторы
14: Array& operator=(const Array&);
15: int& operator[](int offSet);
16: const int& operator[](int offSet) const;
17:
18: //
19: int GetitsSize const { return itsSize; }
20:
21: // функция-друг
22: friend ostream& operator<<
23: (ostream&, const Array&);
24:
25: // определение классов исключений
26: class xBoundary { };
27: class xSize
28: {
29: public:
30: xSize(int size):itsSize(size) { }
31: ~xSize{ }
32: virtual int GetSize { return itsSize; }
33: virtual void PrintError
34: {
35: cout << "Size error. Received: ";
36: cout << itsSize << endl;
37: }
38: protected:
39: int itsSize;
40: };
41:
42: class xTooBig : public xSize
43: {
44: public:
45: xTooBig(int size):xSize(size){ }
46: virtual void PrintError
47: {
48: cout << "Too big. Received: ";
49: cout << xSize::itsSize << endl;
50: }
51: };
52:
53: class xTooSmall : public xSize
54: {
55: public:
56: xTooSmall(int size):xSize(size){ }
57: virtual void PrintError
58: {
59: cout << "Too small. Received: ";
60: cout << xSize::itsSize << endl;
61: }
62: };
63:
64: class xZero : public xTooSmall
65: {
66: public:
67: xZero(int size):xTooSmall(size){ }
68: virtual void PrintError
69: {
70: cout << "Zero!. Received: " ;
71: cout << xSize::itsSize << endl;
72: }
73: };
74:
75: class xNegative : public xSize
76: {
77: public:
78: xNegative(int size):xSize(size){ }
79: virtual void PrintError
80: {
81: cout << "Negative! Received: ";
82: cout << xSize::itsSize << endl;
83: }
84: };
85:
86: private:
87: int *pType;
88: int itsSize;
89: };
90:
91: Array::Array(int size):
92: itsSize(size)
93: {
94: if (size == 0)
95: throw xZero(size);
96: if (size > 30000)
97: throw xTooBig(size);
98: if (size <1)
99: throw xNegative(size);
100: if (size < 10)
101: throw xTooSmall(size);
102:
103: pType = new int[size];
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.
Анализ:
В листинге 20.5 показано объявление виртуального метода PrintError в классе xSize, который выводит сообщения об ошибках и истинный размер класса. Этот метод замешается в каждом производном классе исключения.В строке 142 объявляется объект исключения, который является ссылкой. При вызове функции PrintError со ссылкой на объект благодаря полиморфизму вызывается нужная версия функции PrintError. В результате программный код становится яснее, проще для понимания, а следовательно, и для дальнейшей поддержки.