Чтение онлайн

на главную - закладки

Жанры

Освой самостоятельно С++ за 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.

Анализ:

В листинге 20.5 показано объявление виртуального метода PrintError в классе xSize, который выводит сообщения об ошибках и истинный размер класса. Этот метод замешается в каждом производном классе исключения.

В строке 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];

Поделиться:
Популярные книги

Отец моего жениха

Салах Алайна
Любовные романы:
современные любовные романы
7.79
рейтинг книги
Отец моего жениха

Машенька и опер Медведев

Рам Янка
1. Накосячившие опера
Любовные романы:
современные любовные романы
6.40
рейтинг книги
Машенька и опер Медведев

Эволюционер из трущоб. Том 4

Панарин Антон
4. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб. Том 4

Жребий некроманта 3

Решетов Евгений Валерьевич
3. Жребий некроманта
Фантастика:
боевая фантастика
5.56
рейтинг книги
Жребий некроманта 3

Кодекс Крови. Книга III

Борзых М.
3. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга III

Тайны затерянных звезд. Том 2

Лекс Эл
2. Тайны затерянных звезд
Фантастика:
боевая фантастика
космическая фантастика
космоопера
фэнтези
5.00
рейтинг книги
Тайны затерянных звезд. Том 2

Законы Рода. Том 5

Flow Ascold
5. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Законы Рода. Том 5

Хозяйка усадьбы, или Графиня поневоле

Рамис Кира
Любовные романы:
любовно-фантастические романы
5.50
рейтинг книги
Хозяйка усадьбы, или Графиня поневоле

Боец с планеты Земля

Тимофеев Владимир
1. Потерявшийся
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Боец с планеты Земля

Попаданка для Дракона, или Жена любой ценой

Герр Ольга
Любовные романы:
любовно-фантастические романы
7.17
рейтинг книги
Попаданка для Дракона, или Жена любой ценой

Неудержимый. Книга XXI

Боярский Андрей
21. Неудержимый
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Неудержимый. Книга XXI

Младший сын князя. Том 2

Ткачев Андрей Юрьевич
2. Аналитик
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Младший сын князя. Том 2

Идеальный мир для Лекаря 17

Сапфир Олег
17. Лекарь
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 17

Сколько стоит любовь

Завгородняя Анна Александровна
Любовные романы:
любовно-фантастические романы
6.22
рейтинг книги
Сколько стоит любовь