    Шаблонные классы 

    Шаблонные классы предоставляют вам еще большие возможности, чем 
шаблонные функции. Шаблон класса обеспечивает скелет обобщенного класса для 
его последующей реализации. Как и шаблоны функций, шаблоны классов чаще всего 
объявляются в заголовочных файлах. В листинге 15.12 демонстрируется объявление 
шаблона класса, реализующего в данном случае базу данных с небольшим числом 
записей. Однако это всего лишь заголовочный файл, и вы не можете его скомпилировать. 

    Листинг 15.12.  DB.H (шаблон класса TDatabase) 

    1:	// db.h -- Объявление шаблонного класса TDatabase 
    2: 
    3:	#ifndef __DB_H 
    4:	#define     __DB H   1               // Предотвращение нескольких «include 
    5: 
    6:	template<class T> 
    7:	class TOatabase { 
    8:	private: 
    9:	   Т *rp;           // Указатель на записи 
    10:	   int num;          // Число записей 
    11:	public: 
    12:	   TDatabase(int n) 
    13:	       { rp = new T[num = n]; } 
    14:	   ~TDatabase()
    15:	    { delete[] rp; } 
    16:	  void DoNotning(void); 
    17:	  Т &GetRecord(int recnum); 
    18:	}; 
    19: 
    20:	template<class T> 
    21:	void TDatabase<T>::OoNothing(void) 
    22:	{ 
    23:	} 
    24: 
    25:	template<class T> 
    26:	Т &TDatabase<T>::GetRecord(int recnum) 
    27:	{ 
    28:	  Т *crp = rp; // Указатель на текущую запись = указатель на записи 
    29:	  if (0 <= recnum && recnum < num) 
    30:	     while (recnum--  > 0) 
    31:	         crp++; 
    32:	return *crp; 
    33:	} 
    34: 
    35:	#endif   //     OB H 

    Объявление шаблона класса имеет следующий общий вид: 

    template<class T> class TDatabase { 
        // Закрытые, защищенные и открытые члены класса 
    }

    где Т — неопределенный тип, задаваемый пользователем шаблона. (Вы можете 
заменить Т на любой другой идентификатор, если захотите.) Т можно впоследствии 
заменить любым встроенным типом, другим классом, указателем и т.д. TDatabase — 
имя шаблонного класса. Для ясности заголовок шаблона лучше объявлять в 
отдельных строках: 

    template<class T> class TAnyClass { 
      ......
    } 

    Можно также указать несколько неопределенных типов: 

    template<class T1, class T2, class T3> class TAnotherClass { 
      ...       
    }	

    В шаблоне класса класс Т можно использовать для объявления данных-членов, 
типов возвращаемых функциями-членами значений, параметров и прочих элементов 
неопределенных типов. Например, в объявлении , TDatabase в строке 9 
объявляется указатель на Т с именем гр: 

    T *гр: 


    15. Передовые средства C++     391 
