Шаг 23 - Строим класс DBFRecordType

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

Описание класса

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;
};

Пока пожалуй все. На данном этапе я думаю нам хватит возможностей этого класса, а если что будем наращивать на него новое "мясо" :-).


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Кузин Андрей - 23.06.2000