|
Программирование >> Инициализация объектов класса, структура
(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; ошибка Следующий шаг - вставка элемента, для представления которого мы выбрали отдельный
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |