Глава 10. Объектно-ориентированное программирование
#include
#include
using namespace s t d ;
i n t main ( )
{
//перехват выхода индекса за границу массива:
try
{
s t r i n g s ( " s d f " ) ;
s . r e p l a c e ( 1 0 0 , 1 , 1 , ’ c ’ ) ;
}
catch ( out_of_range &e )
{
c o u t << "Обнаружен выход индекса за границу массива: " << e . what ( ) << e n d l ;
}
catch ( e x c e p t i o n &e )
{
c o u t << "Обнаружена ошибка неопределённого вида: " << e . what ( ) << e n d l ;
}
catch ( . . . )
{
c o u t << "Неизвестная ошибка\ n " ;
}
//перехват ошибки, возникающей в момент выполнения:
try
{
throw r u n t i m e _ e r r o r ( "ошибка в ходе выполнения" ) ;
}
catch ( r u n t i m e _ e r r o r &e )
{
c o u t << "Обнаружена ошибка при выполнении программы: " << e . what ( ) << e n d l ;
}
catch ( e x c e p t i o n &e )
{
c o u t << "Обнаружена ошибка неопределённого вида: " << e . what ( ) << e n d l ;
}
catch ( . . . )
{
c o u t << "Неизвестная ошибка\ n " ;
}
return 0 ;
}
В первом случае исключение с индикатором out_of_range генерируется авто-
матически, когда мы допускаем выход индекса за границу строки (такая возмож-
ность реализована классом string из стандартной библиотеки). Во втором слу-
чае исключительную ситуацию с индикатором runtime_error (обозначающим
ошибку, возникающую в момент выполнения программы) мы порождаем прину-
дительно, передавая конструктору объекта — индикатора исключения строку с
описанием подробностей.
10.6
Шаблоны классов
Шаблоны классов во многом похожи на шаблоны функций, рассмотренные
ранее. Точно так же, как и в случае шаблонов функций, шаблоны классов позво-
ляют отделить общий алгоритм от его реализации под конкретные типы данных.
Классический пример ситуации, когда выгодно применять шаблоны классов
— это так называемые контейнеры, т. е. классы, содержащие наборы некоторых
Программирование на языке С++ в среде Qt Creator
10.6. Шаблоны классов
317
значений (динамические списки, массивы, множества). Закладывая тип данных
элемента как параметр шаблона, можно создать универсальный класс-контейнер,
а на его основе порождать объекты для хранения наборов элементов конкретного
типа — контейнер целых чисел, контейнер строк и т. д.
Описание шаблона класса также имеет много общего с шаблоном функции.
Описание класса точно так же начинают с ключевого слова template, за которым
следует список формальных параметров шаблона в угловых скобках. Этот же за-
головок повторяется и перед описанием методов класса. В качестве параметров
шаблона можно передавать типы данных или константы, но перед идентифика-
тором, обозначающим тип данных, в списке формальных параметров ставится
ключевое слово class.
В отличие от шаблонов функций, для которых фактические параметры шаб-
лона (т. е. конкретные типы данных) определяются по типам аргументов, пе-
реданных функции, для шаблонов классов фактические параметры необходимо
передавать явно. Список фактических параметров шаблона указывается после
имени класса в угловых скобках во всех случаях, когда имя шаблонного клас-
са используется в программе — например, при порождении объектов, или при
указании принадлежности элемента-члена класса. Дальнейшее обращение с по-
рождёнными объектами не отличается от обычных классов.
Рассмотрим в качестве простого примера уже знакомый класс point, который
хранит пару координат точки и на этот раз имеет метод info(), выводящий
координаты на экран.
#include
using namespace s t d ;
template
c l a s s p o i n t
{
Type x , y ;
// . . .
public :
p o i n t ( Type x , Type y ) { this−>x=x ; this−>y=y ; }
void i n f o ( ) ;
} ;
template
void p o i n t : : i n f o ( )
{
c o u t << "Координаты точки: x = " << x << " , y = " << y << e n d l ;
}
main ( )
{
p o i n t f ( 1 0 . 1 , 2 0 . 5 ) ;
f . i n f o ( ) ;
}
Как видим, конкретный тип (в нашем случае float) мы указали при созда-
нии объекта в угловых скобках. Точно так же мы могли указать любой стандарт-
ный тип данных, а могли — пользовательский тип, объявленный в программе.
Однако необходимо помнить, что шаблоны функций и шаблоны классов могут
работать только для тех типов данных (в т. ч. классов), которые поддерживают
необходимые операции. Например, если мы захотим создать экземпляр класса
point
для хранения пары объектов какого-то собственного класса X, этот класс
© 2015 Алексеев Е. Р., Злобин Г. Г., Костюк Д. А., Чеснокова О. В., Чмыхало А. С.
318
Do'stlaringiz bilan baham: |