Программирование >>  Инициализация объектов класса, структура 

1 ... 70 71 72 [ 73 ] 74 75 76 ... 395


(7) ( 8 5 3 2 1 1 0 )

Конкатенация добавляет элементы второго списка в конец первого. Например, для двух списков:

(4)( 0 1 1 2 ) listl (4)( 2 3 5 8 ) list2

операция

listl.concat( list2 ); превращает list1 в

(8) ( 0 1 1 2 2 3 5 8 )

Чтобы сделать из этого списка последовательность чисел Фибоначчи, м1 можем воспользоваться функцией remove() :

listl.remove( 2 );

Мы определили поведение нашего списка, теперь можно приступать к реализации. Пусть список (list) и элемент списка (list item) будут представлены двумя разными классами. (Ограничимся теми элементами, которые способны хранить только целые значения. Отсюда названия наших классов - ilist и ilist item.)

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

Функция display() распечатывает размер списка и все его элементы. Пустой список можно представить в виде:

П 0) ( ) I

а список из семи элементов как:

i (7) ( 0 1 1 2 3 5 8 ) I

reverse() меняет порядок элементов на противоположный. После вызова

mylist.reverse(); предыдущий список выглядит таким образом:



class ilist { public:

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

ilist();

int size();

...

private:

запрещаем инициазацию и присваивание одного списка другому ilist( const ilist& ); ilist& operator=( const ilist& );

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

реализации. Теперь определение класса ilist выглядит таким образом: };

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

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();

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



class ilist item { public:

...

private:

int value;

ilist item * next;

класс:

Член value хранит значение, а next - адрес следующего элемента или 0.

Конструктор ilist item требует задания значения и необязательного параметра -адреса существующего объекта ilist item. Если этот адрес задан, то создаваемый объект ilist item будет помещен в список после указанного. Например, для списка

Р0 1 1 2 5

вызов конструктора

ilist item ( 3, pointer to 2 ); модифицирует последовательность так:

0 1 1 2 3 5

Вот реализация ilist item. (Напомним, что второй параметр конструктора является необязательным. Если пользователь не задал второй аргумент при вызове конструктора, по умолчанию употребляется 0. Значение по умолчанию указ1вается в объявлении функции, а не в ее определении; это поясняется в главе 7.)

int main() {

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

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



1 ... 70 71 72 [ 73 ] 74 75 76 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика