Вы уже должны быть знакомы с технологией построения двусвязных списков, хотя бы из предыдущих шагов или из раздела про теорию. Поэтому не буду подробно рассказывать о управляющем классе. Как и любой другой он должен содержать конструктор создающий список и деструктор правильно удаляющий список из памяти, и конечно процедуры и функции для добавления элемента, поиска и т.д.
Описание класса
class DBFRecordType { DBFRecordTypeField *List; public: DBFRecordType(); ~DBFRecordType(); void Add(DBFRecordTypeField *New); DBFRecordTypeField *FindField(char *name_); unsigned int Length(); };
Конструктор черезвычайно прост :-)
DBFRecordType::DBFRecordType(){ List=NULL; };
Деструктор также практически стандартный. Интересно сколькими способами можно осуществить его удаление :-) При рисовании этого деструктора у меня вертелось в голове два и я выбрал наиболее простой.
DBFRecordType::~DBFRecordType(){ DBFRecordTypeField *temp; temp=List->Next; while (List!=NULL){ delete List; List=temp; temp=temp->Next; }; };
Теперь процедура добавления элемента. В данном случае у нас получится список типа очередь.
void DBFRecordType::Add(DBFRecordTypeField *New){ DBFRecordTypeField *temp=List; if (List==NULL){ List=New; New->Position=1; return; }; while (temp->Next!=NULL) { temp=temp->Next; }; temp->Next=New; New->Pred=temp; New->Position=temp->Position+temp->TotalLen; };
Прочитав данную процедурку Вы должны были заметить строчки для подсчета позиции поля в записи. Это считаю хорошее свойство файлов DBF, которое позволяет достаточно быстро найти требуемую запись и поле в ней.
Теперь процедурка обеспечивающая поиск в списке поля c именем name_.
DBFRecordTypeField *DBFRecordType::FindField(char *name_){ DBFRecordTypeField *temp; temp=List; while (temp!=NULL){ if (stricmp(temp->Name,name_)==0){ return temp; }; temp=temp->Next; }; return NULL; };
Эта функция подсчитывает общий размер записи в байтах. Она потребуется нам в дальнейшем.
unsigned int DBFRecordType::Length(){ DBFRecordTypeField *temp; unsigned int c=0; temp=List; while (temp!=NULL){ c+=temp->TotalLen; temp=temp->Next; }; return c; };
Пока пожалуй все. На данном этапе я думаю нам хватит возможностей этого класса, а если что будем наращивать на него новое "мясо" :-).