Студопедия

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

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

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






Листинг 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];

82: throw xBoundary();

83: }

84:

85: template < class T>

86: ostream& operator< < (ostream& output, const Array< T> & theArray)

87: {

88: for (int i = 0; i< theArray, GetitsSize(); i++)

89: output < < " [" < < i < < " ] " < < theArray[i] < < endl;

90: return output;

91: }

92:

93:

94: int main()

95: {

96:

97: try

98: {

99: Array< int> intArray(9);

100: for (int j = 0; j< 100; j++)

101: {

102: intArray[j] = j;

103: cout < < " intArray[" < < j < < " ] okay..." < < endl;

104: }

105: }

106: catch (xBoundary)

107: {

108: cout < < " Unable to process your input! \n";

109: }

110: catch (Array< int>:: xSize)

111: {

112: cout < < " Bad Size! \n";

113: }

114:

115: cout < < " Done.\n";

116: return 0;

117: }

 

Результат:

You asked for an array of zero objects!

Done

 

Анализ: Первое исключение, xBoundary, объявлено вне определения шаблона в строке 4; второе исключение, xSize, — внутри определения шаблона в строке 28. Исключение xBoundary не связано с классом шаблона, но его можно использовать так же, как и любой другой класс. Исключение xSize связано с шаблоном и должно вызываться для экземпляра класса Array. Обратите внимание на разницу в синтаксисе двух операторов catch. Строка 106 содержит выражение catch (xBoundary), а строка 110 — выражение catch (Array< int>:: xSize). Второй вариант связан с обращением к исключению экземпляра целочисленного массива.

 






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