Программирование >>  Инициализация объектов класса, структура 

1 ... 274 275 276 [ 277 ] 278 279 280 ... 395


namespace cplusplus primer {

определение Queue и его функций-членов

/ / объявление специазации cplusplus primer::Queue<char*>

template<> class cplusplus primer::Queue<char*> { ... };

объявление специализации функции-члена cplusplus primer::Queue<double>::remove() template<> double cplusplus primer::Queue<double>::remove()

{ . .. }

Объявления специализаций класса cplusplus primer::Queue<char*> и функции-члена remove() для класса cplusplus primer::Queue<double> находятся в глобальной области видимости. Поскольку такая область содержит пространство имен cplusplus primer, а имена специализаций квалифицированы его именем, то определения специализаций для шаблона Queue вполне законны.

16.13. Шаблон класса Array

В этом разделе mi завершим реализацию шаблона класса Array, введенного в разделе 2.5 (этот шаблон будет распространен на одиночное наследование в разделе 18.3 и на множественное наследование в разделе 18.6). Так выглядит полный заголовочный файл:



#ifndef ARRAY H #define ARRAY H #include <iostream>

template <class elemType> class Array; template <class elemType> ostream&

operator<<( ostream &, Array<elemType> & );

template <class elemType> class Array {

public:

explicit Array( int sz = DefaultArraySize ) { init( 0, sz ); }

Array( const elemType *ar, int sz ) { init( ar, sz ); }

Array( const Array &iA )

{ init( iA. ia, iA. size ); }

~Array() { delete[] ia; }

Array & operator=( const Array & ); int size() const { return size; }

elemType& operator[]( int ix ) const { return ia[ix]; }

ostream& os = cout ) const;

void

ostream &print( void grow();

void sort( int,int ); int find( elemType ); elemType min(); elemType max(); private:

void init( const elemType*, int ); void swap( int, int );

static const int DefaultArraySize = 12;

int size; elemType * ia;

#endif

Код, общий для реализации всех трех конструкторов, вынесен в отдельную функцию-член init() . Поскольку она не должна напрямую вызываться пользователями шаблона класса Array, мы поместили ее в закрытую секцию:



template <class elemType> Array<elemType>&

Array<elemType>::operator=( const Array<elemType> )

if ( this != ) {

delete[] ia;

init( i. ia, i. size );

return *this;

отмечалось в разделе 14.7, в код включена защита от копирования объекта в самого себя:

Функция-член print() отвечает за в1вод объекта того типа, которым конкретизирован шаблон Array. Возможно, реализация несколько сложнее, чем необходимо, зато данные аккуратно размещаются на странице. Если экземпляр конкретизированного класса Array<int> содержит элементы 3, 5, 8, 13 и 21, то выведены они будут так:

Р(5) < 3, 5, 8, 13, 21 >

Оператор потокового вывода просто вызывает print(). Ниже приведена реализация обеих функций:

template <class elemType>

void Array<elemType>::init( const elemType *array, int sz )

size = sz;

ia = new elemType[ size ];

for ( int ix = 0; ix < size; ++ix ) if ( ! array )

ia[ ix ] = 0; else ia[ ix ] = array[ ix ];

Реализация копирующего оператора присваивания не вызывает затруднений. Как



1 ... 274 275 276 [ 277 ] 278 279 280 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика