Навигация
Главная
Поиск
Форум
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
Реклама
Сейчас на сайте
Гостей: 9
На сайте нет зарегистрированных пользователей

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

Моделирование интернет магазина (Apache, Php, Html) на GPSS + Блок схема
Расчет мер близости на отношениях на Delphi + Пояснительная записка
Моделирование работы перекрёстка по регулированию движения на GPSS + Поя...

Реализация стека в виде шаблона
Реализация стека в виде шаблона потребовала некоторых изменений. Во-первых, в стеке с указателями (см. листинг 6.9) методы top() и рор() возвращали нуль (недопустимое значение для указателей), если стек был пуст. Такое решение подходит для указателей, но совершенно не годится для шаблонов — мы не можем знать, какие значения типа Т являются допустимыми, а какие — нет. Поэтому в шаблонном классе вместо возврата значения генерируется исключение Error.
Во-вторых, написан деструктор. И при реализации деструктора, и при реализации методов top () и pop () неявно предполагалось, что класс Т имеет конструктор копирования, так как этот конструктор будет вызываться в деструкторе стека, при возврате значения из методов top() ирор(),а также в теле цикла:
while(!emptyO) { Т t = рор(); }
Кроме того, класс Т должен иметь конструктор по умолчанию, который будет вызываться в методе push () при создании нового элемента стека. Неявные предположения такого рода при создании шаблонных классов программист обязательно должен иметь в виду.
Использование шаблонного стека демонстрирует программа-клиент. Сначала создается стек с числами типа double:
TStack<double> t;



Обнаружив такую запись, компилятор создает из шаблонного класса конкретный класс, подставив на место Т тип double (листинг 11.2). Процесс создания конкретного класса из шаблона путем подстановки аргументов называется ин-станцированием шаблона (см. п. 14.7 в [1]).
ПРИМЕЧАНИЕ
. Термин «инсталлирование» (instantiation) не слишком понятен, хотя стал уже практически общепринятым. К сожалению, именно этот термин использовался при переводе самой важной книги о шаблонах [28] и при переводе «библии по С++» [2]. В русском языке наиболее близко передает смысл этого понятия термин «конкретизация».

Листинг 11.2. Инстанцированный шаблон
class TStack { struct Elem { double data: Elem *next;
Elem (const double& d. Elem *p) :data(d). next(p) { }
};
Elem * Head; int count;
TStack(const TStack &);
TStack& operator=(const TStack &);
public:
class Error: public std::exception { };
TStackO: Head(0), count(0) { }
-TStackO
{ while( lemptyO) pop(); } void push(const double& d) { Head = new Elem(d, Head); ++count;
}
double top() const { if (lemptyO) return Head->dat else throw ErrorO ;
// имя корректируется компилятором
// подставпен тип double
// подставлен тип double

// указатель на вершину
// счетчик элементов
// закрыли копирование
// закрыли присваивание
// исключение - пустой стек
// конструктор
// деструктор!
// подставпен тип double
// новый элемент в стек
// увеличиваем счетчик
II подставлен тип double




Листинг 11.2 (продолжение)
void pop()
{ if (emptyO) throw Error();
double top = Head->data; // подставлен тип double
Elem *oldHead = Head; Head = Head->next; delete oldHead;
--count; // уменьшаем счетчик
}
bool emptyO const // есть ли элементы в стеке
{ return Head==0; }
int countO const // количество элементов в стеке
{ return count; }
};



Именно этот класс после подстановки транслируется и попадает в работающую программу. Именно он и используется при объявлении объекта-стека t в программе-клиенте (см. листинг 11.1). Далее выполняется обычная работа с этим стеком, в частности аргументы-числа метода push() переводятся по умолчанию в double.
Обратите внимание, что имя инстанцированного класса выделено курсивом. Дело в том, что компилятор корректирует имя инстанцированного класса аналогично тому, как он поступает с именами функций при перегрузке. Зачем же это нужно? Когда компилятор встречает другое объявление, то снова инстанцируется конкретный класс-стек, например, для работы со строками используется такое объявление:
TStack<string> S;



Очевидно, имена у классов TStack<double> и TStack<string> должны различаться, иначе возникает ошибка повторного определения.
Таким образом, каждое объявление объекта-стека с аргументом-типом приводит к появлению в программе соответствующего инстанцированного класса. Если наследование и композиция служат для многократного использования объектного кода, то шаблоны, как мы видим, позволяют многократно использовать исходные тексты.
В качестве шаблонного типа мы можем задавать и указатели. Например, мы вполне можем написать в программе следующее объявление:
TStack<void *> st;



По этому объявлению создается класс, практически совпадающий с первым универсальным стеком (см. листинг 6.9) — добавлен только деструктор. И работать с таким стеком нужно точно так же, как и с определенным вручную:
st.push(new double(21)); // помещаем в стек числа
st.push(new double(22)) st.push(new double(23))
while (!st.empty()) // пока стек не пустой
{ cout << *(double *)st.top() << endl; // выводим число с вершины
double *р = (double *)st.pop(); // удаляем элемент из стека
delete р; // возвращаем память


Опубликовал Kest December 06 2013 00:02:50 · 0 Комментариев · 3632 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
Самоучитель C++
Размещение элемен...
Эффект лампы на р...
Игра Car [Исходни...
C++ Стандартная б...
Расширенный загру...
Dnavigator
Geo-Whois
Printgrid
PDF
Киллер окон
Архив программ
SendSMS для PHP-F...
Пример клиента ФТ...
Запрет гостям ск...
Программирование ...
DelphiX
GPSS World Studen...
Report
Drag&Drop

Топ загрузок
Приложение Клие... 100772
Delphi 7 Enterp... 97809
Converter AMR<-... 20260
GPSS World Stud... 17014
Borland C++Buil... 14189
Borland Delphi ... 10267
Turbo Pascal fo... 7372
Калькулятор [Ис... 5972
Visual Studio 2... 5206
Microsoft SQL S... 3661
Случайные статьи
Операции управлени...
Элементы коллекции...
Приемы, которые тр...
Parimatch Casino
Тайные каналы
О ВРЕМЕНИ, О П...
Игровые слоты кази...
Основная структура...
Алгоритмы цифровой...
Класс TGraphicsObject
Переменные объекты
Перегрузка методов...
БЛАГОДАРНОСТИ
Слоты онлайн ПМ Ка...
Определите тип инф...
Типовой проект обл...
Краткая характерис...
Функциональное про...
Политика выполнения
Настройка окон раб...
Выpазить чеpез K и...
Примечание Для про...
Функция GetBkColor...
Машины VAX-11 и пр...
Файловые потоки бы...
Статистика



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


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