Программирование >>  Дополнительные возможности наследования 

1 ... 212 213 214 [ 215 ] 216 217 218 ... 265


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;



1 ... 212 213 214 [ 215 ] 216 217 218 ... 265

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика