Вторым классом, который требуется для класса CGIApp должен быть класс хранящий имена передаваемых параметров и их значение.
Для хранения значений параметров мы уже сделали класс CGIContent. Нам осталось добавить в класс переменную для имени и методы для обеспечения добавления параметров и их быстрого поиска. Структура класса очень похожа на класс CGIContent. Класс CGIParamItem будет элементом списка, а класс CGIParam управляющим:
class CGIParam; class CGIParamItem { friend CGIParam; char *Name; CGIContent *Content; CGIParamItem *Next; public: CGIParamItem(); ~CGIParamItem(); }; CGIParamItem::CGIParamItem(){ Name=NULL; Next=NULL; Content=new CGIContent(); }; CGIParamItem::~CGIParamItem(){ if (Name!=NULL) free(Name); delete Content; if (Next!=NULL) delete Next; };
Класс CGIParamItem содержит имя параметра в переменной Name, а содержимое в Content.
Теперь класс CGIParam:
class CGIParam{ CGIParamItem *List; public: CGIParam(); ~CGIParam(); CGIContent *Add(char *name,char *Buffer); CGIContent *Find(char *name); }; CGIParam::CGIParam(){ List=NULL; }; CGIParam::~CGIParam(){ if (List!=NULL) delete List; }; CGIContent *CGIParam::Add(char *name,char *Buffer){ CGIParamItem *temp,*p; temp=new CGIParamItem(); temp->Name=strdup(name); temp->Content->Add(Buffer); if (List==NULL){ List=temp; } else { p=List; while (p->Next!=NULL) p=p->Next; p->Next=temp; }; return temp->Content; }; CGIContent *CGIParam::Find(char *name){ CGIParamItem *temp=List; while (temp!=NULL){ if (strcmp(temp->Name,name)==0) return temp->Content; temp=temp->Next; }; return NULL; };
Удобство этого класса очевидно. Позволяет хранить большие объемы, обеспечивает очень быстрый поиск нужного параметра. Теперь вместо просмотра всех данных, как раньше, требуется всего лишь просмотреть имена параметров, что, собственно говоря, и требуется. Кроме того эти классы в будущем будут хранить уже декодированные данные. Раньше нам нельзя было декодировать данные потому, что мы могли потерять связки разделяющие имена параметров и их содержимое между собой, т.е. могли бы появиться нежелательные символы & и = и испортить все картину. Теперь этого никогда не произойдет, т.к. данные хранятся отдельно друг от друга и бережно охраняются своими управляющими классами. Преимущество ООП вообще еще состоит в и том, что создав класс вы можете не беспокойться о динамическом распределении памяти, правильно написанные конструкторы и деструкторы будут заботиться об этом без вашего участия.