Технология ООП
Санкт-Петербургский государственный политехнический университет
27 сентября 2011
Технология ООП
Шаблоны классов
c l a s s Queue {
public :
Queue ( ) ;
~Queue ( ) ;
i n t& remove ( ) ;
v o i d add ( const i n t & ) ;
bool is_empty ( ) ;
bool i s _ f u l l ( ) ;
private :
};
Queue q i ;
Технология ООП
Шаблоны классов
template <c l a s s Type>
c l a s s Queue {
public :
Queue ( ) ;
~Queue ( ) ;
Type& remove ( ) ;
v o i d add ( const Type & ) ;
bool is_empty ( ) ;
bool i s _ f u l l ( ) ;
private :
};
Queue<i n t > q i ;
Технология ООП
Шаблоны классов
t y p e d e f double Type ;
template <c l a s s Type>
c l a s s QueueItem {
public :
private :
Type i t e m ;
QueueItem ∗ n e x t ;
};
Технология ООП
Шаблоны классов
template<c l a s s T = char> c l a s s S t r i n g ;
S t r i n g <> ∗p ;
Технология ООП
Шаблоны классов
template<c l a s s L i s t >
class List
{
public :
void p r i n t ( ) ;
};
template <c l a s s Data> v o i d L i s t <Data > : : p r i n t ( ) ;
Технология ООП
Шаблоны классов
template<c l a s s L i s t >
class List
{
public :
void p r i n t ( ) ;
};
template <c l a s s Data> v o i d L i s t <Data > : : p r i n t ( ) ;
Технология ООП
Шаблоны классов
template< template<c l a s s U> c l a s s V> c l a s s C {
V<i n t > y ;
V<i n t ∗> y1 ;
};
Технология ООП
Шаблоны классов
#i n c l u d e <i o s t r e a m >
template <i n t N>
struct Factorial {
enum { v a l = F a c t o r i a l <N−1 >:: v a l ∗ N } ;
};
template<>s t r u c t F a c t o r i a l <0>{
enum { v a l = 1 } ;
};
i n t main ( ) {
s t d : : c o u t << F a c t o r i a l <4 >:: v a l << "\n" ; } // на э т а п е
компиляции
Технология ООП
Шаблоны классов
template<c l a s s T> v o i d f ( ) { T : : x ∗ p ; . . . }
template<c l a s s T> v o i d f ( ) { typename T : : x ∗ p ; ...
}
Технология ООП
Не стоит злоупотреблять шаблонами
. . / g l o b a l . h : 1 4 5 : e r r o r : i n p a s s i n g argument 3 o f ‘
i n t v s t d : : f i n d P o s ( const s t d : : v
e c t o r <T1 , s t d : : a l l o c a t o r <_CharT> >&, const T2&,
Func&) [ w i t h T1 = s t d : : p a i r <c o n s
t C G H e r o I n s t a n c e ∗ , CPath ∗>, T2 = const
C A r m e d I n s t a n c e ∗ , Func = b o o s t : : _bi : : bind_
t<bool , bool ( ∗ ) ( const s t d : : p a i r <const
C G H e r o I n s t a n c e ∗ , CPath∗>&, const CGHeroIn
s t a n c e ∗ const s t d : : p a i r <const C G H e r o I n s t a n c e ∗ ,
CPath ∗ > : : ∗ , const C A r m e d I n s t a n c e ∗
const &) , b o o s t : : _bi : : l i s t 3 <b o o s t : : arg <1> ( ∗ ) ( ) ,
b o o s t : : _bi : : v a l u e <const CGHeroI
n s t a n c e ∗ s t d : : p a i r <const C G H e r o I n s t a n c e ∗ , CPath
∗ >::∗ > , b o o s t : : arg <2> ( ∗ ) ( )> >] ’
Технология ООП
Спецификаторы класса памяти
auto
register
static
extern
Технология ООП
inline-функции
inline double Sqr(double x) return x*x;
Технология ООП
Спецификатор volatile
volatile int i;
Технология ООП
Преобразования типов
Операция const_cast.
v o i d p r i n t ( i n t ∗p ) { c o u t << ∗p ; }
const i n t ∗p ;
p r i n t ( p ) ; // ошибка
i n t ∗ j = const_cast<i n t ∗>(p ) ;
Технология ООП
mutable
class mutable_test
{
int data ;
mutable s y n c s y n c _ o b j ;
public :
void set_data ( i n t i )
{
sync_obj . l o c k ( ) ;
data = i ;
sync_obj . unlock ( ) ;
}
i n t get_data ( ) const
{
sync_obj . l o c k ( ) ;
int i = data ;
sync_obj . unlock ( ) ;
return i ;
}
};
Технология ООП
Преобразование типов
Операция dynamic_cast. Преобразования бывают двух типов:
повышающее – приведение производного класса к
базовому
понижающее — из базового класса в производный
перекрестное — приведение между производными типами
Технология ООП
dynamic_cast
Повышающее преобразование.
c l a s s B{ . . . } ;
c l a s s C : p u b l i c B{ . . . } ;
C ∗ c = new C ;
B ∗b = dynamic_cast<B∗>( c ) ; // Эквивалентно B ∗b = c
;
Технология ООП
dynamic_cast
Понижающее преобразование. Применяется когда компилятор
не может проверить правильность приведения. Для
использования данного типа преобразований необходимо
включить механизм RTTI.
c l a s s B{ p u b l i c : v i r t u a l v o i d f 1 ( ) {} } ;
c l a s s C : p u b l i c B{ p u b l i c : v o i d f 2 ( ) {} } ;
C ∗ c = new C ;
B ∗b = new B ;
C ∗ temp = dynamic_cast<C∗>(b ) ;
i f ( temp )
temp−>f 2 ( ) ;
Технология ООП
dynamic_cast
Перекрестное преобразование.
c l a s s B{ p u b l i c : v i r t u a l v o i d f 1 ( ) {} } ;
c l a s s C : p u b l i c B{ p u b l i c : v o i d f 2 ( ) {} } ;
c l a s s D : p u b l i c B{ . . . } ;
D ∗d = new D ;
C ∗ temp = dynamic_cast<C∗>(d ) ;
i f ( temp )
temp−>f 2 ( ) ;
Технология ООП
dynamic_cast
Для доступа к RTTI введена операция typeid и класс type_info.
class B { . . . };
class C : public B { . . . };
B ∗p = new C ;
i f ( t y p e i d ( ∗ p ) == t y p e i d (C) )
{
dynamic_cast<C∗>(p )−>f 2 ( ) ;
c o u t << t y p e i d ( ∗ p ) . name ( ) ;
}
Технология ООП
static_cast
Выполняется на этапе компиляции над:
целыми типами
целыми и вещественными типами
целыми и перечисляемыми типами
указателями и ссылками одной иерархии
Технология ООП
reinterpret_cast
Применяется для преобразования не связных между собой
типов, например указателей в целые и наоборот.
char ∗p = r e i n t e r p r e t _ c a s t <char ∗>( m a l l o c ( 1 0 ) ) ;
Технология ООП