Что такое произвольный элемент коллекции
Каким образом можно определить произвольный элемент коллекции ? Это та основа, которая объединяет конкретные типы элементов (классы: целые, вещественные, строки и т.д.). В Си++ для этой цели используются абстрактные базовые классы. Все функции-элементы такого класса являются виртуальными, все переопределяются в производных классах. Абстрактный класс элементов таблицы является общим интерфейсом конкретных типов элементов (классов) ко всем остальным классам программы.
//------------------------------------------------------bk8-02.cpp
//------Класс абстрактных элементов коллекции
class ostream;
class TElem
{
public:
TElem(); // Конструктор
virtual ~TElem();
//----- Виртуальный деструктор. Если объект производного
// класса уничтожается по указателю на объект базового,
// то деструктор должен быть виртуальной функцией. Это
// случается при уничтожении динамических объектов в
// операции delete.
virtual BOOL FromString(char *)=0;
virtual char *ToString()=0;
//----- Функции загрузки содержимого объекта из строки и
// создания строки, содержащей внешнее представление зна-
// чения объекта.
friend ostream& operator<<(ostream& s, TElem *pm)
{
char *p;
p = pm->ToString();
s << p;
delete p;
return s;
}
//----- Переопределенный оператор << вывода в поток объекта
// TElem, заданного указателем (вызывается виртуальная
// функция ToString в производном классе)
virtual int Compare(TElem *)=0;
//----- Функция сравнения двух объектов. Является основой
// любой сортировки, упорядочения и поиска объекта. Дает
// результат вида:
// 0 - значения равны,
// -1 - значение текущего объекта меньше значения
// объекта - параметра.
// 1 - значение текущего объекта больше
virtual BOOL IsValid()=0;
//----- Функция проверки корректности значения объекта
virtual TElem *Copy()=0;
//----- Функция создания копии объекта, точнее объекта того
// же производного класса, что и текущий.
virtual int IDENT()=0;
virtual char *Name()=0;
//----- Функции, идентифицирующие производный класс объекта,
// возвращают его идентифицирующий номер и строковую
// константу - имя класса.
//----- Следующие функции связаны с хранением объекта в
// файле. Для работы с двоичным файлом произвольного до-
// ступа объект должен уметь сохранить свое значение по
// произвольному смещению в файле (Save), загрузить зна-
// чение (Load), добавить значение (Append). Для других
// классов, осуществляющих планирование файла, важно также
// знать размерность даннных объекта в файле (FSize).
virtual int FSize()=0;
virtual FPTR Update(BinFile&, FPTR=FNULL,int=1)=0;
virtual FPTR Append(BinFile&)=0;
virtual BOOL Load(BinFile&, FPTR=FNULL)=0;
};
TElem::TElem() {}
TElem::~TElem() {}