|
Программирование >> Структурное программирование
12.7. Шаблоны и друзья Мы уже знаем, что функции и целые классы могут быть объявлены друзьями не шаблонных классов. Для шаблонов классов также могут быть установлены отношения дружественности. Дружественность может быть установлена между шаблоном класса и глобальной функцией, функцией-элементом другого класса (возможно, шаблонного класса) или даже целым классом (возможно, шаблонным классом). Оформление этих отношений дружественности - дело не простое. Если внутри шаблона класса X, объявленного как template<class Т> class X находится объявление дружественной функции friend void f1{); то функция fl является дружественной для каждого шаблонного класса, полученного из данного шаблона. Если внутри шаблона класса X, объявленного как template<class Т> class X находится объявление дружественной функции в форме friend void f2(Х<Т> &); TO для конкретного типа Т, например, float, дружественной для класса X<float> будет только функция f2(X<float> &). Внутри шаблона класса вы можете объявить функцию-элемент другого класса дружественной для любого шаблонного класса, полученного из данного шаблона. Для этого нужно использовать имя функции-элемента другого класса, имя этого класса и бинарную операцию разрешения области действия. Например, если внутри шаблона класса X, который был объявлен как template<class Т> class X объявляется дружественная функция в форме friend void A::f4(); TO функция-элемент f4 класса A будет дружественной для каждого шаблонного класса, полученного из данного шаблона. Внутри шаблона класса X, который был объявлен следующим образом template<class Т> class X 12.6. Шаблоны и наследование Шаблоны и наследование связаны друг с другом следующим образом: Шаблон класса может быть производным от шаблонного класса. Шаблон класса может являться производным от не шаблонного класса. Шаблонный класс может быть производным от шаблона класса. Не шаблонный класс может быть производным от шаблона класса. объявление дружественной функции в виде friend void C<T>::f5 (Х<Т> &) ; для конкретного типа Т, например, float, сделает функцию-элемент C<float>::f5(X<float> &) другом только шаблонного класса X<float>. Внутри шаблона класса X, объявленного как template<class Т> class X можно объявить другой, дружественный класс Y friend class Y; в результате чего, каждая из функций-элементов класса Y будет дружественной для каждого шаблонного класса, произведенного из шаблона класса X. Если внутри шаблона класса X, который был объявлен как template<class Т> class X объявлен второй класс Z в виде friend class Z<T>; ТО при создании шаблонного класса с конкретным типом Т, например, типом float, все элементы класса Z<float> будут друзьями шаблонного класса X<float>. 12.8. Шаблоны и статические элементы в заключение скажем несколько слов относительно статических данных-элементов. Давайте вспомним, что в не шаблонных классах одна копия статического элемента данных используется всеми представителями класса и что статический элемент данных должен быть инициализирован в области действия файл. Каждый шаблонный класс, полученный из шаблона класса, имеет собственную копию каждого статического элемента данных шаблона; все экземпляры этого шаблонного класса используют свой статический элемент данных. Как и статические элементы данных не шаблонного класса, статические элементы данных шаблонных классов должны быть инициализированы в области действия файл. Каждый шаблонный класс получает собственную копию статической функции-элемента шаблона класса. Резюме Шаблоны дают нам возможность определять при помощи одного фрагмента кода целый набор взаимосвязанных функций (перегруженных), называемых шаблонными функциями, или набор связанных классов, называемых шаблонными классами. Чтобы использовать шаблоны функций, программист должен написать всего одно описание шаблона функции. Основываясь на типах аргументов, использованных при вызове этой функции, компилятор будет автоматически генерировать объектные коды функций, обрабатывающих каждый тип данных. Все описания шаблонов функций начинаются с ключевого слова template, за которым следует список формальных параметров шаблона, заключаемый в угловые скобки (< и >); каждому формальному параметру должно предшествовать ключевое слово class. Ключевое слово class, используемое при определении типов параметров шаблона функции, фактически означает: любой встроенный тип или тип, определяемый пользователем . Формальные параметры в описании шаблона используются для определения типов параметров функции, типа возвращаемого функцией значения и типов переменных, объявляемых внутри функции. Сам шаблон функции может быть перегружен несколькими способами. Мы можем определить другие шаблоны, имеющие то же самое имя функции, но различные наборы параметров. Шаблон функции может также быть перегружен, если мы введем другую не шаблонную функцию с тем же самым именем, но другим набором параметров. Шаблон класса представляет собой некое общее описание родового класса, на основе которого создаются специфические версии для конкретных типов данных. Шаблоны классов часто называют параметризованными типами, так как они имеют один или большее количество параметров типа, определяющих настройку родового шаблона класса на специфический тип данных при создании объекта класса. Для того, чтобы использовать шаблонные классы, программисту достаточно один раз описать шаблон класса. Каждый раз, когда требуется реализация класса для нового типа данных, программист, используя простую краткую запись, сообщает об этом компилятору, который и создает исходный код для требуемого шаблонного класса. Описание шаблона класса выглядит как традиционное описание класса, за исключением заголовка template<class Т>, указывающего на то, что это описание является шаблоном класса с параметром типа Т, обозначающим тип классов, которые будут создаваться на основе этого шаблона. Идентификатор Т определяет тип данных-элементов, хранящихся в стеке, и может использоваться в заголовке класса и в функциях-элементах. Каждое описания функции-элемента вне заголовка шаблона класса начинается с заголовка template<class Т>, за которым следует описание функции, подобное стандартному описанию, но как тип элемента класса всегда указывается параметр типа Т. Чтобы связать каждое описание функции-элемента с областью действия шаблона класса, используется бинарная операция разрешения области действия с именем шаблона класса ClassName<T>. В шаблонах имеется возможность использовать так называемые нетиповые параметры. Для специфического типа можно определить класс, отменяющий действие шаблона класса для данного типа. Шаблон класса может быть производным от шаблонного класса. Шаблон класса может являться производным от не шаблонного класса. Шаблонный класс может быть производным от шаблона класса. Не шаблонный класс может быть производным от шаблона класса.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |