Студопедия

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

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

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






  • Листинг 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 :: Мои Лекции
    Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
    Копирование текстов разрешено только с указанием индексируемой ссылки на источник.