предполагается, что функция будет реализована в производном классе. 
Предполагается, что функция-член CompareElems() возвращает нуль, если два объекта 
класса TElem, на которые ссылаются указатели р1 и p2 идентичны. Очевидно, вы все еще 
не можете завершить функцию CompareElemsO, поскольку вы не имеете ни маллейшего 
представления о том, что содержит класс TElem. Конечно, с помощью 
виртуальных функций-членов вы можете, по крайней мере, завершить обобщенную 
планировку, необходимую для класса TSet. планировка объявлена и "частично 
реализована в строках 22-26. Встраиваемый конструктор класса (строки 21-22) 
инициализирует закрытые данные-члены класса и обращается к new для выделения 
массива указателей PTElem. Деструктор класса (строки 23-24) освобождает эту память, 
очищая все объекты TSet перед их выходом из области видимости. 
    Функции-члены AddElem() и HasElem() (строки 25-26) слишком длинны для 
того, чтобы сделать их встраиваемыми. Модуль реализации класса (листинг 14.6) 
дополняет эти функции. (Вы можете скомпилировать эту программу, но для 
того, чтобы использовать класс, необходима основная программа. Пример приво--  
дится в следующем разделе.) 

    14.6.  SET.CPP (реализация класса TSet) 

    1:  // set.cpp -- Реализация класса TSet 
    2:
    3:    #include <iostream.h> 
    4:    #include <stdlib.h> 
    5:    #include "set.h" 
    6:
    7:	// Добавляет элемент в множество. (В случае ошибки программа прерывается!) 
    8:	void TSet: :AddElem( PTElem p) 
    9:	{ 
    10:	  if (set == NULL) { 
    11:	    cout « "\nERROR: Out of memory"; 
    12:	    exit ( 1 ) ;                             
    13:	  }      
    14:	  if (index >= max) {                     
    15:	    cout « "\nERROR: Set limit exceeded";          
    16:	    exit(1);                              
    17:	  } 
    18:	  set[index] = p; 
    19:	  ++index; 
    20:	} 
    21: 
    22:	// Возвращает истину, если элемент, адресуемый р, находится в множестве 
    23:	int TSet:: HasElem( PTElem p) 
    24:	{                 
    25:	  if (set == NULL)           
    26:	    return 0; // В пустом множестве не может быть элементов     
    27:	  for ( int i = 0; i < index; i++  ) 
    28:	    if (CompareElems(p, setfi]) ==0)       
    29:	        return 1; // Элемент в множестве                    
    30:	  return 0; // Элемента в множестве нет         
    31:	}                                      


    В SET.CPP реализуются две функции — AddElemO и HasElemO. Любопытно, что 
эти функции написаны до того, как будут разработаны элементы, которыми они 
оперируют. Все, что известно об элементах, это лишь тоо. что они имеют тип 
неопределенного класса с именем TElem. 
    Но даже в этом случае AddElemO (строки 8-20) добавляет в множество объекты 
класса TElem, адресуемые параметром р. В строках 10-17 осуществляется проверка 
состояния ошибки и аварийного завершения программы в случае нехватки памяти 
или переполнения множества. (В более сложных классах обеспечивается тучшая 
обработка ошибок, однако для данного примера вполне достаточно и такой 
минимальной поддержки.) В строках 18-19 объект TElem, на который ссылается 
указатель р, запоминается в массиве set. 
    Функция-член HasElemO (строки 23-31) возвращает истину, если переданный 
объект TElem находится в множестве. Функция HasElemO вызывает чистую 
виртуальную функцию-член класса CompareElemsO в строке 28. Несмотря на то 
что эта функция еще даже не существует, ее уже можно вызвать! В производном 
классе со временем будет реализован настоящий код, осуществляющий сравнение 
двух элементов. Благодаря виртуальным функциям-членам, оператор в строке 28 
может обратиться к еще не реализованному коду. 
    В программе TSET.CPP (листинг 14.7) поставляются недостающие части TSet и 
TElem для создания множества строк, содержащих названия месяцев, имеющих 
ровно 30 дней: апрель, июнь, сентябрь и ноябрь. Программа иллюстрирует, как 
виртуальные функции-члены и абстрактные классы могут обеспечить простоту 
разработки программ, которые будут завершены позднее. Для создания 
законченной программы следует скомпилировать и скомпоновать модули 
TSET.CPP и SET.CPP. Находясь в DOS, введите команду bcc tset set, за


    Глава 14. Объектно-ориентированное программирование 357 
