Навигация
Главная
Поиск
Форум
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
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 8
На сайте нет зарегистрированных пользователей

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

База данных студентов на Delphi (файл записей) + Блок схемы
Информационная система - продуктовый магазин на Turbo Pascal (База данны...
Метод конечных разностей для интерполяции/экстраполяции на Delphi

Реализация контейнера-дека
Обратимся теперь непосредственно к реализации. Сначала покажем составляющие класса 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 06 2013 21:18:49 · 0 Комментариев · 6649 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
OnlineIP
Delphix Sample [И...
SearchAndReplace
Tenis [Исходник н...
Шаблон для новост...
PHP 5. Практика с...
Панель для реклам...
WinPopup
Delphi. Разработк...
Run
Preview
Программирование ...
ScrollCredit
Microsoft Press -...
C# Учебный курс
Векторный редакто...
Анимированное поя...
Панель статистики...
Как программирова...
Применение жадног...

Топ загрузок
Приложение Клие... 100774
Delphi 7 Enterp... 97836
Converter AMR<-... 20268
GPSS World Stud... 17014
Borland C++Buil... 14191
Borland Delphi ... 10291
Turbo Pascal fo... 7374
Калькулятор [Ис... 5984
Visual Studio 2... 5207
Microsoft SQL S... 3661
Случайные статьи
END expected
Проверка достоверн...
Интерфейс и его де...
компьютеру из сети...
Получение индексны...
Классы в PHP3
Лайтбоксы и вывеск...
Технология Drag&Dr...
Настройка IPv4-aAp...
10.7. Дополнительн...
Гарантирует, что п...
Отделение интерфей...
В этой версии быст...
Мобильное казино ...
Занятие 3
Плотность изображе...
Какие сайты в Инте...
Метаданные. Аннота...
Ввод-вывод на прим...
Повышаем тИЦ
Основные понятия О...
Наборы символов и ...
лучший онлайн-кази...
Процедура SetBkCol...
Общие характеристи...
Статистика



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


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