Навигация
Главная
Поиск
Форум
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
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Модуль Forms 65535
ТЕХНОЛОГИИ ДОСТ... 63028
Имитационное мо... 58348
Реклама
Сейчас на сайте
Гостей: 11
На сайте нет зарегистрированных пользователей

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

База данных междугородних телефонных разговоров на Delphi
Двунаправленный динамический список на Delphi + Блок схемы
Медиа плейер на Delphi + Пояснительная записка

Реклама



Подписывайся на 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 Комментариев · 4826 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
Модифицированная ...
Программирование ...
DeleteEdit
Основы Delphi. Пр...
PHP 5
Пример работы с ф...
Matrix2D
SMExport
Prolog Interprete...
Распознавание тек...
WinAmp
Ehlib
Mass Photo Upload
Borland C++Builde...
Переработанный пл...
DFileDeleter
Srinilist
Распознавание иде...
Генетический алго...
Blib [Исходник на...

Топ загрузок
Приложение Клие... 100480
Delphi 7 Enterp... 87868
Converter AMR<-... 20082
GPSS World Stud... 13504
Borland C++Buil... 12057
Borland Delphi ... 8671
Turbo Pascal fo... 7048
Visual Studio 2... 5005
Калькулятор [Ис... 4908
FreeSMS v1.3.1 3545
Случайные статьи
Статические элементы
Cобытийное моделир...
Суммирование элем...
2.6.3. Установле...
Eazylook
Имитационное модел...
Установка палагино...
Cобытийное моделир...
протоколу аутентиф...
Солнечные батареи ...
Правильное тестиро...
Изменение собствен...
Протокол VRRP и ма...
Различные ограничения
Подготовка приложе...
Суммирование маршр...
GENERATE (ГЕНЕРИРО...
Игры. Безопасность...
Простое открытое н...
транспортном режим...
Файловая система /...
Настройка дизайн-т...
[Authoritylnformat...
Обзор электронной ...
Настройки почтовог...
Статистика



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


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