Вторым классом, который требуется для класса 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;
};
Удобство этого класса очевидно. Позволяет хранить большие объемы, обеспечивает очень быстрый поиск нужного параметра. Теперь вместо просмотра всех данных, как раньше, требуется всего лишь просмотреть имена параметров, что, собственно говоря, и требуется. Кроме того эти классы в будущем будут хранить уже декодированные данные. Раньше нам нельзя было декодировать данные потому, что мы могли потерять связки разделяющие имена параметров и их содержимое между собой, т.е. могли бы появиться нежелательные символы & и = и испортить все картину. Теперь этого никогда не произойдет, т.к. данные хранятся отдельно друг от друга и бережно охраняются своими управляющими классами. Преимущество ООП вообще еще состоит в и том, что создав класс вы можете не беспокойться о динамическом распределении памяти, правильно написанные конструкторы и деструкторы будут заботиться об этом без вашего участия.