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

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

Моделирование интернет кафе на GPSS + Отчет
База данных студентов на Delphi + Microsoft SQL Server
Калькулятор на 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 Комментариев · 4653 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
Delphi 6. Учебный...
Blib [Исходник на...
PHP5. Профессиона...
JanReplace
Игра змейка
EditNew
Пятнашки и крести...
Globus VCL Extent...
Библия хакера 2. ...
Borland Delphi 6....
Delphi на примерах
C++ Builder в за...
Программирование ...
PHP 5 в подлинник...
Drag&Drop
Пример создания W...
WAP версия сайта
Черный круг двига...
TelBook
Tag Игра "Пятнашк...

Топ загрузок
Приложение Клие... 100420
Delphi 7 Enterp... 84880
Converter AMR<-... 20061
GPSS World Stud... 11934
Borland C++Buil... 11401
Borland Delphi ... 8362
Turbo Pascal fo... 7007
Visual Studio 2... 4983
Калькулятор [Ис... 4618
FreeSMS v1.3.1 3529
Случайные статьи
Принтеры и факсы
Рассказывайте людя...
Введение в имитаци...
Подготовка приложе...
Функция GetGraphMo...
Слоты Вулкана
«Использование» ша...
Для каких адресов ...
Выработка решенияК...
для служб терминал...
Интерфейс аппаратн...
Оказывается, деньг...
Использование sysl...
вычисления значени...
ДОСТОИНСТВА И НЕДО...
10.4. Принцип рез...
Записи Android-при...
African vases
Теги Alt и Title в...
SMB-подпись гарант...
Структура простого...
Шашки на Strawberr...
Команда Create Tab...
Apache + Perl + PH...
Случаи применения ...
Статистика



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


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