Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Листинг 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(). В результате программный код становится яснее, проще для понимания, а следовательно, и для дальнейшей поддержки.

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.