|
Программирование >> Инициализация объектов класса, структура
#ifndef QUEUE H #define QUEUE H объявление QueueItem template <class T> class QueueItem; template <class Type> class Queue { public: eue() : front ( 0 ), back ( 0 ) { } ~Queue() ; Type& remove(); void add( const Type & ); bool is empty() const { return front == 0; private: QueueItem<Type> *front; QueueItem<Type> *back; #endif При использовании имени Queue внутри определения шаблона класса Queue список параметров <Type> можно опускать. Однако пропуск списка параметров шаблона QueueItem в определении шаблона Queue недопустим. Так, объявление члена front template <class Type> class Queue { public: ... private: ошибка: список параметров ueItem<Type> *front; Queu является ошибкой: Упражнение 16.1 (a) template <class Type> class Container1; template <class Type, int size> Найдите ошибочные объявления (или пары объявлений) шаблонов классов: (b) template <class T, U, class V> class Container1; class Container2; (c) template <class C1, typename C2> (d) template <typename myT, class myT> (e) template <class Type, int *pi> class Containers {}; class Container4 {}; (f) template <class Type, int val = 0> class Container6; template <class T = complex<double>, int v> class Container5; class Container6; Упражнение 16.2 template <class elemenType> class ListItem; template <class elemType> class List { public: List<elemType>() : at front( 0 ), at end( 0 ), current( 0 ), size( 0 ) List<elemType>( const List<elemType> & ); List<elemType>& operator=( const List<elemType> & ); ~List() ; void insert( ListItem *ptr, elemType value ); int remove( elemType value ); ListItem *find( elemType value ); void display( ostream &os = cout int size() { return size; } private: ListItem * at front; ListItem * at end; ListItem * current; int size Следующее определение шаблона List некорректно. Как исправить ошибку? 16.2. Конкретизация шаблона класса В определении шаблона указывается, как следует строить индивидуальные классы, если заданы один или более фактических типов или значений. По шаблону Queue автоматически генерируются экземпляры классов Queue с разными типами элементов. Например, если написать: Queue<int> qi; то из обобщенного определения шаблона автоматически создается класс Queue для объектов типа int. Генерация конкретного класса из обобщенного определения шаблона называется конкретизацией шаблона. При такой конкретизации Queue для объектов типа int каждое вхождение параметра Type в определении шаблона заменяется на int, так что template <class int> class Queue { public: Queue() : front( 0 ), back ( 0 ) { } ~Queue() ; & int& remove(); void add( const int bool is empty() const { return front == 0; private: QueueItem<int> *front; QueueItem<int> *back; определение класса Queue принимает вид: }; Чтобы создать класс Queue для объектов типа string, надо написать: Queue<string> qs; При этом каждое вхождение Type в определении шаблона будет заменено на string. Объекты qi и qs являются объектами автоматически созданных классов. Каждый конкретизированный по одному и тому же шаблону экземпляр класса совершенно не зависит от всех остальных. Так, у Queue для типа int нет никаких прав доступа к неоткрытым членам того же класса для типа string. Конкретизированный экземпляр шаблона будет иметь соответственно имя Queue<int> или Queue<string>. Части <int> и <string>, следующие за именем Queue, называются фактическими аргументами шаблона. Они должны быть заключены в угловые скобки и отделяться друг от друга запятыми. В имени конкретизируемого шаблона аргументы всегда должны задаваться явно. В отличие от аргументов шаблона функции, аргументы шаблона класса никогда не выводятся из контекста:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |