|
Программирование >> Инициализация объектов класса, структура
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 ]; Реализация копирующего оператора присваивания не вызывает затруднений. Как
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |