С++ для начинающих



         

Пример связанного списка - часть 3


Наш список содержит следующие члены: _at_front – адрес первого элемента, _at_end – адрес последнего элемента и _size – количество элементов. При определении объекта типа ilist все три члена должны быть инициализированы 0. Это обеспечивается конструктором по умолчанию:

class ilist_item;

class ilist {

public:

    // конструктор по умолчанию

    ilist() : _at_front( 0 ),

              _at_end( 0 ), _size( 0 ) {}

    // ...

private:

    ilist_item *_at_front;

    ilist_item *_at_end;

    int _size;

};

Теперь мы можем определять объекты типа ilist, например:

ilist mylist;

но пока ничего больше. Добавим возможность запрашивать размер списка. Включим объявление функции size() в открытый интерфейс списка и определим эту функцию так:

inline int ilist::size() { return _size; }

Теперь мы можем использовать:

int size = mylist.size();

Пока не будем позволять присваивать один список другому и инициализировать один список другим (впоследствии мы реализуем и это, причем такие изменения не потребуют модификации пользовательских программ). Объявим копирующий конструктор и копирующий оператор присваивания в закрытой части определения списка без их реализации. Теперь определение класса ilist выглядит таким образом:

class ilist {

public:

    // определения не показаны

    ilist();

    int size();

    // ...

private:

    // запрещаем инициализацию

    // и присваивание одного списка другому

ilist( const ilist& );

ilist& operator=( const ilist& );

    // данные-члены без изменения

};

Обе строки следующей программы вызовут ошибки компиляции, потому что функция main() не может обращаться к закрытым членам класса ilist:

int main()

{

    ilist yourlist( mylist ); // ошибка

    mylist = mylist;          // ошибка

}

Следующий шаг – вставка элемента, для представления которого мы выбрали отдельный класс:

class ilist_item {

public:

    // ...

private:

    int         _value;

    ilist_item *_next;

};

Член _value хранит значение, а _next – адрес следующего элемента или 0.




Содержание  Назад  Вперед