Язык программирования C++. Вводный курс


Использование шаблонов - часть 3


[ 2 ]  ia: 2    ca: c   da: 3.5

[ 3 ]  ia: 3    ca: d   da: 5.25

Механизм шаблонов можно использовать и в наследуемых классах. Вот как выглядит определение шаблона класса ArrayRC:

#include <cassert>

#include "Array.h"

 

template <class elemType>

class ArrayRC : public Array<elemType> {

public:

    ArrayRC( int sz = DefaultArraySize )

            : Array<elemType>( sz ) {}

    ArrayRC( const ArrayRC& r )

            : Array<elemType>( r ) {}

    ArrayRC( const elemType *ar, int sz )

            : Array<elemType>( ar, sz ) {}

 

    elemType& ArrayRC<elemType>::operator[]( int ix )

    {

        assert( ix >= 0 && ix < Array<elemType>::_size );

        return _ia[ ix ];

    }

private:

// ...

};

Подстановка реальных параметров вместо типа-параметра elemType происходит как в базовом, так и в производном классах. Определение

ArrayRC<int> ia_rc(10);

ведет себя точно так же, как определение IntArrayRC из предыдущего раздела. Изменим пример использования из предыдущего раздела. Прежде всего, чтобы оператор

// функцию swap() тоже следует сделать шаблоном

swap( ia1, 1, ia1.size() );

был допустимым, нам потребуется представить функцию swap() в виде шаблона.

#include "Array.h"

 

template <class elemType>

inline void

swap( Array<elemType> &array, int i, int j )

{

  elemType tmp = array[ i ];

  array[ i ] = array[ j ];

  array[ j ] = tmp;

}

При каждом вызове swap()

генерируется подходящая конкретизация, которая зависит от типа массива. Вот как выглядит программа, использующая шаблоны Array и ArrayRC:

#include <iostream>

#include "Array.h"

#include "ArrayRC.h"

 

template <class elemType>

inline void

swap( Array<elemType> &array, int i, int j )

{

  elemType tmp = array[ i ];

  array[ i ] = array[ j ];

  array[ j ] = tmp;

}

 

int main()




Начало  Назад  Вперед