Навигация
Главная
Поиск
Форум
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
Создание отчето... 65024
Модуль Forms 64813
Пример работы с... 63181
ТЕХНОЛОГИИ ДОСТ... 61529
Имитационное мо... 57368
Реклама
Сейчас на сайте
Гостей: 10
На сайте нет зарегистрированных пользователей

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

Обучающая и тестирующая программа по здаче экзамена ПДД на Turbo Pascal ...
Моделирование литейного цеха на GPSS + Пояснительная записка
Моделирование интернет кафе на 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 Комментариев · 4777 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
mmmJlabel
Формирование отче...
Интерактивный инт...
StartMark
AVIwriter
Простой текстовый...
Программирование ...
Assistant
Игра Car [Исходни...
Delphi 6 программ...
Proeffectimage
Atb
Добавление к ссы...
100 компонентов о...
Ics
Report
База Allsubmitter...
DiskInfo
Assembler. Учебни...
Web Регистрация

Топ загрузок
Приложение Клие... 100464
Delphi 7 Enterp... 86597
Converter AMR<-... 20076
GPSS World Stud... 12626
Borland C++Buil... 11746
Borland Delphi ... 8555
Turbo Pascal fo... 7037
Visual Studio 2... 4998
Калькулятор [Ис... 4759
FreeSMS v1.3.1 3541
Случайные статьи
5.2. Отладка
Структура проекта
дополнительные экз...
по адресу http://www
Предварительная по...
Кардшаринг нтв
Сокеты на основе TPI
Pointer type Ident...
Сигналы. Знакомств...
Блок QUEUE
свой технический п...
Как таунхаус Сабур...
Игры. Интернет-пон...
Неподвижная точка
Когда использовать...
ДЕЙСТВИТЕЛЬНО ЛИ Н...
ПРИЛОЖЕНИЕ С. РАЗ...
Вычислительные мо...
Для внутренних зап...
Вулкан онлайн - ву...
Классы и объекты
Если ключом было с...
14.4. Алгоритм сор...
Запуск формы для р...
Оценка недвижимост...
Статистика



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


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