|
Программирование >> Дополнительные возможности наследования
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 77 78 79 80 81 82 83 84 85 86 87 90 91 92 93 public: xTooBig(int size) :xSize(size){ } virtual void PrintErrorO cout Too big. Received: ; cout << xSize::itsSize << endl; class xTooSmall : public xSize { public: xTooSmall(int size):xSize(size){ } virtual void PrintErrorO cout << Too small. Received: ; cout << xSize::itsSize << endl; class xZero : public xTooSmall { public: xZero(int size):xTooSmall(size){ } virtual void PrintErrorO cout << Zero!. Received: ; cout xSize::itsSize endl; class xNegative : public xSize76: public: xNegative(int size):xSize(size){ } virtual void PrintErrorO cout << Negative! Received: ; cout << xSize::itsSize << endl; private: int *pType; int itsSize; Array::Array(int size): itsSize(size) 94: if (size == 0) 95: throw xZero(8lza); 96: If (size > 30000) 97; throw xTooBig(size); 98: if (size <1) 99; throw xNegatlve(size); 100: if (size < 10) 101: throw xTooSnall(size); 102; 103; pType = new int[size]; 104; for (int i = 0; Ksize; 1++) 105; pType[i] = 0; 106: } 107; 108; int& Array;;operator[] (int offSet) 109: ( 110; int size = GetitsSizeO; 111; if (offset >= 0 8,8, offSet < GetitsSizeO) 112; return pType[offSet]; 113: throw xBoundaryO; 114; return pType[0]; 115; } 116; 117: const int& Array:;operator[] (int offSet) const 118; { 119: int size = GetitsSizeO; 120; if (OffSet >= 0 && offSet < GetitsSizeO) 121; return pType[offSet]; 122; throw xBoundaryO; 123; return pType[0]; 124; } 125; 126; Int mainO 127; { 128; 129; try 130; { 131; Array intArray(9); 132; for (Int j = 0; J< 100; J++) 133; { 134; lntArray[J] = j; 135; oout IntArrayE J ] ol<ay,..\ n 136: } 137; } 138; oatoh (Array;;xBoundary) 139; { 140; oout Unable to process your inputl\ n ; 141; } 142; oatoh (Array;;xSlze& theException) 143: { 144 145 146 147 148 149 150 151 152 theException, PrintErrorO; catoh ( ,) ( cout Something went wrong!\ n cout Done,\ n ; return 0; Too small! Received; 9 Done. В листинге 20.5 показано объявление виртуального метода PrintErrorO в классе xSize, который выводит сообщения об ощибках и истинный размер класса. Этот метод замещается в каждом производном классе исключения. В строке 142 объявляется объект исключения, который является ссылкой. При вызове функции PrintErrorO со ссылкой на объект благодаря полиморфизму вызывается нужная версия функции PrintErrorO. В результате профаммный код становится яснее, проще для понимания, а следовательно, и для дальнейщей поддержки. Исключения и шаблоны При создании исключений, предназначенных для работы с шаблонами, есть два варианта решений. Можно создавать исключение прямо в шаблоне, и тогда они будут доступны для каждого экземпляра шаблона, а можно использовать классы исключений, созданные вне объявления шаблона. Оба этих подхода показаны в листинге 20.6. AucmuuB 20.В. Испоньзопаппо исшчепиО с шаОноиами 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include <iostream.h> const int DefaultSize = 10; class xBoundary { } ; template <class T> class Array public: конструкторы Array(int itsSize = DefaultSize); Array(const Array &rhs); ArrayO { delete [] pType;} операторы Arrays. operator=(const Array<T>&); T8, operator[](int offSet); const T& operator[](int offSet) const;
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |