C++ Программирование в среде С++ Builder 5

Определение шаблона класса


Определение шаблона класса предполагает:

  • определение собственно шаблона, синтаксис которого показан выше;
  • определение функций-элементов шаблона;
  • определение статических элементов данных.
  • Определения функций-элементов, расположенные в теле шаблона, ничем не отличаются от определения встроенных функций-элементов обычного класса. Определения функций-элементов, располагаемые вне тела шаблона, имеют такой вид:

    template <список параметров шаблона> возвращаемый_тип имя шаблона< параметры_шаблона>::имя_функции(список_параметров) {тело_функции }

    Подобным же образом определяются статические элементы данных шаблона класса:

    template <список параметров шаблона>

    тип имя шаблона

    <параметры шаблона>::имя статического элемента[ =значение];

    Смысл всех синтаксических элементов определений будет ясен, если рассмотреть пример законченного шаблона класса:

    Листинг 10.2. Шаблон класса DataBase



    ///////////////////////////////////////////////////////

    // Deftmpl.h: Пример определения шаблона класса.

    //

    #ifndef _DEFTMPL_H

    #define _DEFTMPL_H

    template <class T, int numRec> class DataBase { protected:

    const int num.;

    bool err;

    T *base, *cp;

    public:

    DataBase (): num(numRec)

    {

    cp = base = new T[numRec];

    err = false;

    }

    ~DataBase () ( delete [] base;

    } bool Error () { return err; } T SRec(void) ;

    T &Rec(unsigned recno);

    };

    // Возвращает ссылку на текущую запись

    // и переходит к следующей.,

    template <class T, int numRec>

    Т &DataBase<T, numReO: :Rec (void)

    {

    if (cp - base == num) { err = true;

    return *(cp - 1) ;

    }

    else

    return *cp++;

    // Позиционирует указатель и возвращает ссылку

    // на текущую запись.

    template <class T, int numRec>

    T &DataBase<T, numRec>::Rec(unsigned recno)

    {

    if (recno < (unsigned)num) { err=false;

    return *(cp = base+recno);

    }

    else {

    err=true;

    return*(cp=base+num-1);

    }

    }

    #endif

    //_DEFTMPL_H

    Этот шаблон реализует примитивный “поток” или “базу данных”, являющуюся массивом записей, тип которых определяется аргументом шаблона. Класс содержит функции для обращения либо к записи с указанным индексом (Rec (unsigned)), либо к записи, на которую ссылается указатель “базы данных” (Re с (void)). В последнем случае указатель перемещается к следующей записи.

    При выходе за пределы массива устанавливается флаг ошибки, и функции Get () возвращают ссылку на последнюю запись.

    Параметрами шаблона являются формальный тип записи Т и константа — число записей в массиве.

    Функции-элементы шаблона класса, определяемые вне тела шаблона, могут объявляться как встроенные с помощь, ключевого слова inline, подобно функциям-элементам обычных классов. Например, в приведенном выше определении шаблона можно было бы написать:

    template <class T,int numRec>

    inline T &DataBase<T, numRec>::Rec(void)

    {

    if (cp-base== num) {err= true/return*(cp-1) ;

    } else

    return *cp++;

    }



    Содержание раздела