Большая техническая энциклопедия
0 1 3 4 9
D V
А Б В Г Д Е Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ь Э Ю Я
ША ШВ ШЕ ШИ ШК ШЛ ШМ ШН ШО ШП ШР ШТ ШУ

Шаблон - класс

 
Шаблон класса представляет собой некое общее описание родового класса, на основе которого создаются специфические версии для конкретных типов данных.
Шаблон класса может быть производным от шаблонного класса. Шаблон класса может являться производным от не шаблонного класса. Шаблонный класс может быть производным от шаблона класса. Не шаблонный класс может быть производным от шаблона класса.
Дерево двоичного поиска с 12-тью узлами. Шаблоны класса позволяют нам создавать связные классы, каждый из которых базируется на различных типах параметров, и мы можем создавать столько объектов каждого шаблона класса, сколько нам необходимо.
Шаблон класса может быть производным от шаблонного класса.
Шаблон класса может являться производным от не шаблонного класса.
Шаблон класса Stack, рассмотренный в предыдущем разделе, использовал только параметр типа в заголовке шаблона. Но в шаблонах имеется возможность использования и так называемых нетиповых параметров.
Пример вывода программы, приведенной на. Шаблон класса стеков используется в функции main для реализации стека intStack типа Stackint с целыми числами. Целые значения от О до 3 помещаются в стек intStack и затем выталкиваются из него. Шаблон класса стеков используется также для реализации стека со значениями с плавающей запятой floatStack типа Stackfloat. Значения с плавающей точкой 1.1, 2.2, 3.3 и 4.4 помещаются в стек floatStack и затем выталкиваются из него.
Описание шаблона класса выглядит как традиционное описание класса, за исключением заголовка templateclass T, указывающего на то, что это описание является шаблоном класса с параметром типа Т, обозначающим тип классов, которые будут создаваться на основе этого шаблона. Идентификатор Т определяет тип данных-элементов, хранящихся в стеке, и может использоваться в заголовке класса и в функциях-элементах.
Почему нередко шаблон класса называют параметризованным типом.
Пример вывода программы, приведенной на. Конечно, шаблон класса списков включает и другие функции-элементы ( insertAtFront и removeFromBack), которые не желательно было бы делать доступными для класса очередей через открытый интерфейс. Так что когда мы указываем, что шаблон класса очередей должен наследовать шаблон класса списков, то задаем скрытое наследование.
Деструктор для шаблона класса определяется с использованием синтаксиса, подобного синтаксису конструктора.
При определении шаблона класса можно использовать параметры-константы и параметры типов вместо конкретных констант или типов.

Для использования шаблона класса CTypedPtrArray ( или любого из шаблонов MFC-классов) в программу нужно включить файл заголовков MFC Afxtempl. Чтобы сделать этот файл доступным для любого заголовочного или исходного файла в проекте MiniDraw, его можно включить в стандартный файл заголовков StdAfx.
Предположим, что шаблон класса Employee имеет статический элемент данных count. Предположим далее, что из этого шаблона класса получены три шаблонных класса.
Дерево двоичного поиска. Рассмотрим теперь описания шаблона класса и функций-элементов.
Пример программы стека, использующей композицию. Другим способом реализации шаблона класса стеков является повторное использование шаблона класса списков посредством создания композиции. Программа, приведенная на рис. 15.11, использует заголовочные файлы list. Вывод является тем же самым.
При создании объекта по шаблону класса нужно точно определить значения параметров шаблона.
Напишите программу, в которой используется шаблон класса Array. Из этого шаблона может быть получен представитель класса Array для любого типа элемента.
Каждый шаблонный класс, полученный из шаблона класса, имеет собственную копию каждого статического элемента данных шаблона; все экземпляры этого шаблонного класса используют свой статический элемент данных. Как и статические элементы данных не шаблонного класса, статические элементы данных шаблонных классов должны быть инициализированы в области действия файл. Каждый шаблонный класс получает собственную копию статической функции-элемента шаблона класса.
Каждый шаблонный класс, полученный из шаблона класса, имеет собственную копию каждого статического элемента данных шаблона; все экземпляры этого шаблонного класса используют свой статический элемент данных. Как и статические элементы данных не шаблонного класса, статические элементы данных шаблонных классов должны быть инициализированы в области действия файл.
Шаблонный класс может быть производным от шаблона класса.
Не шаблонный класс может быть производным от шаблона класса.
Каждый шаблонный класс получает собственную копию статической функции-элемента шаблона класса.
Опишите отношения дружественности, возникающие, если внутри шаблона класса поместить приведенные ниже операторы, объявляющие друзей.
Вставка и удаление любого элемента связного списка) Наш шаблон класса связных списков выполняет операции вставки и удаления элементов только в начале и конце списка. Эти возможности удобны в том случае, если мы используем скрытое наследование и композицию для разработки шаблонов класса стеков и класса очередей с помощью незначительных добавлений к повторно используемому шаблону класса связных списков. Действительно, связные списки являются наиболее общими структурами, которые мы используем в программах.

Для специфического типа можно определить класс, отменяющий действие шаблона класса для данного типа.
Как для шаблона функции, так и для функции-члена шаблона класса, компилятор не генерирует код до фактического вызова функции. Он генерирует различные версии кода для каждого объекта, которому соответствует уникальный набор параметров шаблона. Несмотря на это, можно использовать явное создание экземпляра, когда компилятор генерирует код для всех функций-членов класса или отдельных функций-членов без фактического вызова какой-либо функции-члена.
Другим способом реализации шаблона класса стеков является повторное использование шаблона класса списков посредством создания композиции. Программа, приведенная на рис. 15.11, использует заголовочные файлы list. Вывод является тем же самым.
Если несколько шаблонных классов произведены от одного и того же шаблона класса с единственным статическим элементом данных, то каждый из шаблонных классов совместно использует одну копию этого статического элемента данных.
Графическое представление списка. Программа, приведенная на рис. 15.3, состоит из двух шаблонов класса: ListNode и List. Каждый объект, инкапсулированный в шаблон класса List, является связным списком объектов класса ListNode. Элемент data класса ListNode хранит значение типа NODETYPE, этот тип параметра передается шаблону класса. Элемент указатель nextPtr класса ListNode хранит указатель на следующий объект класса ListNode в связном списке.
Опишите, как нужно определить класс для специфического типа, чтобы переопределить шаблон класса именно для этого типа.
В строке 42 объявляется шаблон функции operator () в качестве друга шаблона класса Array. Поскольку operator () реализован в виде функции шаблона, то каждый экземпляр этого типа параметризованного массива будет автоматически иметь функцию operateг () для вывода данных соответствующего типа. Каждый член массива вызывается по очереди. Этот метод работает только в том случае, если функция operator () определена для каждого типа объекта, сохраняемого в массиве.
Для того, чтобы использовать шаблонные классы, программисту достаточно один раз описать шаблон класса. Каждый раз, когда требуется реализация класса для нового типа данных, программист, используя простую краткую запись, сообщает об этом компилятору, который и создает исходный код для требуемого шаблонного класса.
Используя в качестве отправной точки класс List, разработанный в упражнении 17.8, создайте шаблон класса List, способный создавать экземпляры объектов класса List для хранения различных типов данных.
Используя в качестве отправной точки класс Queue, разработанный в упражнении 17.9, создайте шаблон класса Queue, способный создавать экземпляры объектов класса Queue для хранения различных типов данных.
Чтобы сгенерировать семейство родственных классов для работы с различными типами данных, необходимо определить единственный шаблон класса.
Программа на рис. 15.9 ( вывод данных этой программы показан на рис. 15.10) создает шаблон класса стеков главным образом посредством скрытого наследования шаблона класса списков. Заметим, что они, по существу, являются соответственно функциями шаблона класса списков insertAtFront, removeFromFront, isEmpty и print. Конечно, шаблон класса списков включает и другие функции-элементы ( например, insertAtBack и removeFromBack), которые нам не хотелось бы делать доступными через открытый интерфейс класса стеков. Так что когда мы указываем, что шаблон класса стеков должен наследовать шаблон класса списков, то задаем скрытое наследование. Это приводит к тому, что все функции-элементы шаблона класса списков в шаблоне класса стеков становятся скрытыми.
Обработка очереди ( часть 2 из 2 Типичная ошибка программирования. Программа, приведенная на рис. 15.12 ( вывод данных показан на рис. 15.13), создает шаблон класса очередей используя скрытое наследование шаблона класса списков. Заметим, что эти фукции-элементы, по существу, являются функциями-элментами шаблона класса списков inserAtBack, removeFromFront, isEmpty и print соответственно.

Шаблоны классов часто называют параметризованными типами, так как они имеют один или большее количество параметров типа, определяющих настройку родового шаблона класса на специфический тип данных при создании объекта класса.
Программа, приведенная на рис. 15.12 ( вывод данных показан на рис. 15.13), создает шаблон класса очередей используя скрытое наследование шаблона класса списков. Заметим, что эти фукции-элементы, по существу, являются функциями-элментами шаблона класса списков inserAtBack, removeFromFront, isEmpty и print соответственно.
Программа на рис. 15.9 ( вывод данных этой программы показан на рис. 15.10) создает шаблон класса стеков главным образом посредством скрытого наследования шаблона класса списков. Заметим, что они, по существу, являются соответственно функциями шаблона класса списков insertAtFront, removeFromFront, isEmpty и print. Конечно, шаблон класса списков включает и другие функции-элементы ( например, insertAtBack и removeFromBack), которые нам не хотелось бы делать доступными через открытый интерфейс класса стеков. Так что когда мы указываем, что шаблон класса стеков должен наследовать шаблон класса списков, то задаем скрытое наследование. Это приводит к тому, что все функции-элементы шаблона класса списков в шаблоне класса стеков становятся скрытыми.
Описание шаблона класса выглядит как традиционное описание класса, за исключением заголовка templateclass T, указывающего на то, что это описание является шаблоном класса с параметром типа Т, обозначающим тип классов, которые будут создаваться на основе этого шаблона. Идентификатор Т определяет тип данных-элементов, хранящихся в стеке, и может использоваться в заголовке класса и в функциях-элементах.
Программа, приведенная на рис. 15.3 ( выходные данные, полученные в результате выполнения этой программы, показаны на рис. 15.4), использует шаблон класса List ( см. главу 12 Шаблоны) для манипуляций со списком данных целого типа и списком данных с плавающей запятой. Детальное обсуждение этой программы будет дано ниже. В упражнении 15.20 предлагается реализовать рекурсивную функцию, которая печатает связный список в обратной последовательности; а в упражнении 15.21 предлагается реализовать рекурсивную функцию поиска указанного элемента данных в связном списке.
Шаблоны класса позволяют нам создавать связные классы, каждый из которых базируется на различных типах параметров, и мы можем создавать столько объектов каждого шаблона класса, сколько нам необходимо.
Шаблон класса может быть производным от шаблонного класса. Шаблон класса может являться производным от не шаблонного класса. Шаблонный класс может быть производным от шаблона класса. Не шаблонный класс может быть производным от шаблона класса.
Если для специфического типа данных нужен класс, который не соответствует общему шаблону класса, вы можете явно определить его, отменив тем самым действие шаблона для этого типа. Например, шаблон класса Array может использоваться для создания массивов любого типа.
В отличие от не шаблонных классов, которые могут быть вложенными, шаблоны классов не могут вкладываться друг в друга. Попытка вложить один шаблон класса внутрь другого приводит к синтаксической ошибке.
Жучки: что неправильно в приведенном ниже программном коде. Предположите, что определяется шаблон класса List, a Cat - это класс, определенный на одном из предыдущих занятий.
 
Loading
на заглавную 10 самыхСловариО сайтеОбратная связь к началу страницы

© 2008 - 2014
словарь online
словарь
одноклассники
XHTML | CSS
Лицензиар ngpedia.ru
1.8.11