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

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

Расчет мер близости на отношениях на Delphi + Пояснительная записка
Моделирование интернет кафе на GPSS + Отчет
Моделирование регулировочного участка цеха на 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 Комментариев · 4240 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
Андрей Боровский....
Песочные часы
iComm v.6.1 - выв...
Базы данных в Инт...
DCMintry
Панель поиска
Разработка клиент...
Керниган Б.В., Ри...
Система баннеро...
Панель Наша Кнопка
Паскаль и Дельфи....
Flash MP3 Player ...
Delphi на примерах
Алгоритм DES шифр...
Размещение элемен...
С. Г. Горнаков - ...
Rotolabel
PRNDbgrid
С/C++ Программиро...
Cooltray

Топ загрузок
Приложение Клие... 100793
Delphi 7 Enterp... 98016
Converter AMR<-... 20298
GPSS World Stud... 17059
Borland C++Buil... 14238
Borland Delphi ... 10373
Turbo Pascal fo... 7390
Калькулятор [Ис... 6080
Visual Studio 2... 5228
Microsoft SQL S... 3674
Случайные статьи
Практические реком...
not(X)
Играйте бесплатно ...
Поиск и устранение...
Несжатые данные
Тип данных char
Заблуждения и недо...
журналов доступа в...
Сложение и непосре...
Работа с хэшами в ...
Играть в онлайн ка...
Построение символь...
Информационные и с...
Всё о баннерах
Окно «Параметры Wo...
Игровые автоматы. ...
Настройки приватности
Внедрение решения
Раздел описания пе...
5.2. Отладка
Вычислительные мо...
Обработка сигналов...
Общие настройки
Игровые автоматы к...
Оператор цикла for
Статистика



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


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