Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Содержание сайт... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Создание отчето... 63889
Модуль Forms 63622
ТЕХНОЛОГИИ ДОСТ... 60470
Пример работы с... 59819
Имитационное мо... 55931
Реклама
Сейчас на сайте
Гостей: 7
На сайте нет зарегистрированных пользователей

Пользователей: 13,079
новичок: Openair
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Расчет мер близости на отношениях на Delphi + Пояснительная записка
База данных склада на Delphi + Схема БД
Моделирование информационно-поисковой библиографической системы на gpss ...

Реклама



Подписывайся на YouTube канал о программировании, что бы не пропустить новые видео!

ПОДПИСЫВАЙСЯ на канал о программировании
Реализация контейнера-дека
Обратимся теперь непосредственно к реализации. Сначала покажем составляющие класса TDeque, а затем — всю его структуру. В листинге 6.1 представлена приватная часть класса.
Листинг 6.1. Приватная часть класса TDeque private:

class Elem // элемент дека
{ friend class TDeque;
friend class iterator;
Elem(const double &a):item(a){ }
Elem(){}
~Elem(){} // объявлять необязательно
double item; // информационная часть элемента
Elem *next; // следующий элемент
Elem *prev; // предыдущий элемент
};
// запрещаем копировать и присваивать деки TDeque& operator=(const TDeque &); TDeque(const TDeque &);
long count; //количество элементов
Elem *Head; // Начало дека л
продолжение &
Листинг 6.1 {продолжение)
Elem "Tail; // указатель на запредельный элемент
// для итератора iterator head; iterator tail;



Вся внутренность класса Elem закрыта, поэтому классы TDeque и iterator объявлены друзьями, чтобы иметь доступ к конструкторам и указателю. Можно поступить и по-другому — просто сделать все члены класса Elem открытыми:
struct Elem
{ Elem(const double &a):item(a){ } Elem(){} '
~Elem(){} // объявлять необязательно
double item; // информационная часть элемента
Elem *next; // следующий элемент
Elem *prev; // предыдущий элемент
>:



В этом случае друзей объявлять не требуется — классы TDeque и i terator и так имеют доступ ко всем элементам класса Elem.
Чтобы не отвлекаться от главной задачи — изучения доступа посредством итератора, — мы объявили конструктор копирования и операцию присваивания закрытыми. Да и нет особой необходимости (пока) присваивать деки. Наличие объявления приводит к тому, что компилятор не будет создавать эти функции по умолчанию. Таким образом, мы запретили создавать копии контейнера-дека и присваивать один дек другому. Следствием является также и то, что контейнер нельзя передавать по значению в качестве параметра и возвращать в качестве результата.
Далее объявлены поля класса TDeque: счетчик элементов контейнера, реальные уй^аййтели на начало и конец списка. Счетчик увеличивается при каждом добавлении элемента и уменьшается при каждом удалении элемента. Поля-указатели никогда не равны О, так как даже в пустом контейнере присутствует запредельный фиктивный элемент (см. рис. 6.2).
А вот программе-клиенту указатели недоступны — она работает с итераторами. Следовательно, нужны аналогичные поля для класса-итератора, которые этим классом и инициализируются. Сам класс-итератор (листинг 6.2) определен в открытой части класса TDeque.

Листинг 6.2. Класс iterator
class iterator
{ friend class TDeque;
iterator(Elem *el):the_elem(el){} public:
// конструкторы
i terator (): the__elem(0) {}
iterator(const iterator &it):the_elem(it.the_elem){} // присваивание итераторов - генерируется по умолчанию // сравнение итераторов bool operator==(const iterator &it) const
{ return (the_elem == it.the_elem); } bool operator!=(const iterator &it) const { return !(it == *this); }
// продвижение к следующему элементу - только префиксная форма iterator& operator++()
{ if ((the_elem!=©)&&(the_elem->next!=©)) the_elem = the_elem->next; return *this;
}
// продвижение к предыдущему элементу - только префиксная форма iterator& operator--()
{ if ((the_elem!=0)&&(the_elem->prev!=O)) the_elem = the_elem->prev; return *this;
}
// получить ссылку на информационную часть // работает справа и слева от знака присваивания double& operator*() const { if (the_elem != 0) return the_elem->item; else { cout << "Null iterator!" << endl; abort(); }
}
private:
Elem *the_elem; // вот это итератор скрывает!
};



Единственный закрытый элемент классауказатель на элемент контейнера-дека. Именно этот указатель должен скрывать итератор, предоставляя пользователю более надежный способ доступа. Однако для первоначальной установки указателя нашему деку требуется конструктор с указателем. Поэтому реализован приватный конструктор, и класс-дек сделан другом класса-итератора.
Хотя мы не обрабатываем ошибки1, тем не менее операции продвижения не приводят к непредсказуемому поведению программы — при некорректном указателе продвижение просто не выполняется и возвращается текущий итератор.
В операции разыменования operator * указатель на элемент проверяется на нуль. Эта проверка необходима, так как в классе-итераторе есть конструктор по умолчанию, обнуляющий этот указатель, — программа-клиент ведь может объявить итератор, но не инициализировать его. Операция возвращает ссылку, чтобы выражение *iterator можно было использовать слева от знака присваивания для изменения значения элемента контейнера.
Все методы удобнее реализовать именно внутри класса iterator, так как при реализации вне его (и вне класса TDeque) придется писать слишком длинные префиксы.
Программистам тоже нужна одежда - http://tom-tailor-online.ru/categories/muzhskaja-odezhda-verkh-100/tolstovki тут недорого.
Разработанный с учетом всех этих соображений класс TDeque представлен в листинге 6.3.
В этом классе надо обратить внимание на несколько моментов. Во-первых, так как приватная часть прописана в конце, требуется опережающее объявление класса Elem, иначе класс iterator не сможет объявить свой указатель на элемент.
Опубликовал Kest November 07 2013 01:18:49 · 0 Комментариев · 4733 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
DemoEdit [Исходни...
Язык программиров...
Pass [Исходник на...
Swat [Исходник на...
AlnComponents
Шифрование по алг...
С# для профессион...
TelBook
Web Регистрация
C# Учебный курс
Adapter (пример D...
Интерактивный инт...
Х. М. Дейтел, П. ...
Добавление к ссы...
PHP глазами хакера
C++ Builder 6 СПР...
3d Tank [Исходник...
Развивающийся фла...
Реализация ЭЦП по...
около 291 статьи ...

Топ загрузок
Приложение Клие... 100449
Delphi 7 Enterp... 85798
Converter AMR<-... 20067
GPSS World Stud... 12518
Borland C++Buil... 11572
Borland Delphi ... 8504
Turbo Pascal fo... 7023
Visual Studio 2... 4989
Калькулятор [Ис... 4739
FreeSMS v1.3.1 3536
Случайные статьи
Форматирование вво...
Перекомпоновка
пару открытый/закр...
Как мне заблокиров...
C++ и мобильность
Отключение коротки...
Объекты WordArt
Инструменты раздел...
Этап опытной экспл...
Оператор ссылки (...
Управление надстро...
Файлы не подчиняют...
Модульность програ...
Дополнительная лит...
Компьютерная арифм...
Для редактирования...
Листинг 13.3. Испо...
Какие возможности ...
Для выбора лучшего...
Печать документа
Получи www.anythin...
Структура книги
Локализация прилож...
Питер Наур и его р...
Основные понятия О...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?