Объектно-ориентированный язык программирования С++ в примерах. Сивохин А.В. - 62 стр.

UptoLike

Составители: 

class slist_iterator /*-итератор циклического односвязного*/
/* списка: */
{ slink* ce;/*-указатель очередного элемента списка;*/
slist* cs;/*-указатель итерируемого списка; */
public:
slist_iterator(slist& s) /*-конструктор: */
{cs=&s;ce=cs->last;}
ent operator()()/*-операция итерирования; */
{ ent ret=ce?(ce=ce->next)->e:0;
if(ce==cs->last)ce=0;/*-конец списка*/
return ret;/*-поле данных или нуль; */
}
};/*-конец определения итератора списка элементов; */
Из класса slist можно получать списки тех объектов,которые
представляют интерес в конкретной программе.Например,для
списка строк символов мы можем построить следующий производ-
ный класс:
struct nlist:slist /*-класс для списка строк знаков; */
{ void insert(char* a) {slist::insert(a);}
void append(char* a) {slist::append(a);}
char* get() { return "ABCDE"; }
nlist(char* a):slist(a) {}
};/*-конец определения призводного класса nlist; */
Функции нового класса или наследуются от slist непосредст-
венно(например,функция clear()),или ничего не делают,кроме
преобразования типа.Класс nlist - это ничто иное,как альтер-
нативный интерфейс класса slist.Так как на самом деле тип
ent есть void*,нет необходимости явно преобразовывать указа-
тели char*,которые используются в качестве фактических пара-
метров.Поиск требуемой строки в списке реализуется следую-
щей функцией:
int find(nlist* spisok,char* stroka)
{ slist_iterator tek_stroka(*(slist*)spisok);
62
 class slist_iterator /*-итератор циклического односвязного*/
                           /* списка:                          */
       { slink* ce;/*-указатель очередного элемента списка;*/
         slist* cs;/*-указатель итерируемого списка;            */
         public:
                   slist_iterator(slist& s) /*-конструктор:     */
                                     {cs=&s;ce=cs->last;}
                  ent operator()()/*-операция итерирования;     */
                       { ent ret=ce?(ce=ce->next)->e:0;
                            if(ce==cs->last)ce=0;/*-конец списка*/
                            return ret;/*-поле данных или нуль; */
                        }
       };/*-конец определения итератора списка элементов;       */


 Из класса slist можно получать списки тех объектов,которые
представляют интерес в конкретной программе.Например,для
списка строк символов мы можем построить следующий производ-
ный класс:


 struct nlist:slist /*-класс для списка строк знаков;           */
         { void insert(char* a)         {slist::insert(a);}
             void append(char* a)       {slist::append(a);}
             char* get()                { return "ABCDE"; }
             nlist(char* a):slist(a) {}
         };/*-конец определения призводного класса nlist;       */


  Функции нового класса или наследуются от slist непосредст-
венно(например,функция clear()),или ничего не делают,кроме
преобразования типа.Класс nlist - это ничто иное,как альтер-
нативный интерфейс класса slist.Так как на самом деле тип
ent есть void*,нет необходимости явно преобразовывать указа-
тели char*,которые используются в качестве фактических пара-
метров.Поиск требуемой строки в списке реализуется следую-
щей функцией:


  int find(nlist* spisok,char* stroka)
      { slist_iterator tek_stroka(*(slist*)spisok);


                                62