Разработка класса, осуществляющего асинхронную работу с файлами, страница 4

Для указателя:

TSpisok<Datatype> *pointer;

pointer=new TSpisok<Datatype>(new Datatype(initial values));

или

pointer=new TSpisok<Datatype>();

где:

Datatype - тип данных каждого элемента

Datatype(initial values) - конструктор для класса Datatype

со входными значениями.

Без использования указателя:

TSpisok<Datatype> array(new Datatype(initial values));

или

TSpisok<Datatype> array();

Доступ к элементам данных:

array[index]       (pointer*)[index]

array.el(index)    pointer->el(index)

*/

#ifndef __TSpisok

#define __TSpisok 1

template<class T>

class __TSpisok_el// Вспомогательный класс

{ public:

T *data;// Указатель на данные

__TSpisok_el *next,*prev;// Указатели на последующий и предыдущий элементы

__TSpisok_el(T *x);// Конструктор

__TSpisok_el();//Другой конструктор

~__TSpisok_el();//Деструктор

};

template<class T>

class TSpisok// Собственно класс списка

{ private:

int n;// Номер текущего элемента

int nmax;// Число элементов

__TSpisok_el<T> *data;// Указатель на текущий элемент

public:

TSpisok(T *);// Конструктор

TSpisok();//Другой конструктор

T& operator [](int);// Выборка элемента

T& el(int);//Выборка элемента

void new_el(T *);// Добавление элемента

void new_el();//Добавление нового элемента без инициализации

void delete_el(int);// Удаление элемента по номеру

int maxnumb();// Число элементов

~TSpisok();// Деструктор

};

#endif

Листинг файла TSpisok.cpp

template<class T> __TSpisok_el<T>::__TSpisok_el(T *x)

{   data=x;

next=NULL;

prev=NULL;

}

template<class T> __TSpisok_el<T>::__TSpisok_el()

{   next=NULL;

prev=NULL;

data=new T;

}

template<class T> __TSpisok_el<T>::~__TSpisok_el()

{   if(data!=NULL)

delete data;

}

template<class T> TSpisok<T>::TSpisok(T *x)

{   data=new __TSpisok_el<T>(x);

n=0;

nmax=1;

}

template<class T> TSpisok<T>::TSpisok()

{   data=NULL;

n=0;

nmax=0;

}

template<class T> T& TSpisok<T>::el(int m)

{   if(m<0||m>=nmax)return *(data->data);

while(m>n)

{   n++;

data=data->next;

}

while(m<n)

{   n--;

data=data->prev;

}

return *(data->data);

}

template<class T> T& TSpisok<T>::operator [](int m)

{   return el(m);

}

template<class T> void TSpisok<T>::new_el(T *x)

{   if(nmax==0)

{   data=new __TSpisok_el<T>(x);

nmax=1;

n=0;

}

else

{     while(n<nmax-1)

{   n++;

data=data->next;

}

data->next=new __TSpisok_el<T>(x);

nmax++;

(data->next)->prev=data;

}

}

template<class T> void TSpisok<T>::new_el()

{   if(nmax==0)

{   data=new __TSpisok_el<T>;

nmax=1;

}

else

{     while(n<nmax-1)

{   n++;

data=data->next;

}

data->next=new __TSpisok_el<T>();

nmax++;

(data->next)->prev=data;

}

}

template<class T> void TSpisok<T>::delete_el(int m)

{   __TSpisok_el<T> *temp;

if(m<0||m>=nmax)return;

while(m>n)

{   n++;

data=data->next;

}

while(m<n)

{   n--;

data=data->prev;

}

temp=data;

if(m!=0)

(data->prev)->next=data->next;

if(m!=nmax-1)

{   (data->next)->prev=data->prev;

data=data->next;

}

else

{   data=data->prev;

n--;

}

delete temp;

nmax--;

}

template<class T> int TSpisok<T>::maxnumb()

{   return nmax;

}

template<class T> TSpisok<T>::~TSpisok()

{   if(nmax>0)

{   while(n>0)

{   n--;

data=data->prev;

}

while(n<nmax-1)

{   n++;

data=data->next;

delete data->prev;

}

delete data;

}

}

Листинг файла TTask.h

#ifndef __TTask

#define __TTask 1

#include<string.h>

class TTask

{

public:

int option;//Тип задания

int length;//Длина записи

char *array;//Массив данных

TTask();

TTask(int opt,int len,char *source);//Конструктор

~TTask();//Деструктор

};

#endif

Листинг файла TTask.cpp

TTask::TTask()

{     array=NULL;

}

TTask::TTask(int opt,int len,char *source)

{   int i,l;

option=opt;

length=len;

switch(option)

{ case 0://Открытие файла

l=strlen(source)+1;

array=new char[l];

for(i=0;i<l;i++)

array[i]=source[i];

break;

case 1://Запись в файл

array=new char[length];

for(i=0;i<length;i++)

array[i]=source[i];