Программирование >>  Инициализация объектов класса, структура 

1 ... 321 322 323 [ 324 ] 325 326 327 ... 395


#include Array RC.C

#include try array.C

int main() {

static int ia[] = { 12, 7, 14, 9, 128, 17, 6,3,27, 5 };

cout << конкретизация шаблона класса AArray RC<int>\n ; try array( iA );

return 0;

После компиляции и запуска программа печатает следующее:

конкретизация шаблона класса Array RC<int>

try array: начальные значения массива ( 10 )< 12, 7, 14, 9, 128, 17 6, 3, 27, 5 >

try array: после присваиваний

( 10 )< 128, 7, 14, 9, 128, 128 6, 3, 27, 3 >

try array: почленная инициализация

( 10 )< 12, 7, 14, 9, 128, 128

6, 3, 27, 3 > try array: после почленного копирования

( 10 )< 12, 7, 128, 9, 128, 128

try array: после вызова grow

( 10 )< 12, 7, 128, 9, 128, 128 6, 3, 27, 3, 0, 0 0, 0, 0, 0 >

искомое значение: 5 возвращенн индекс: -1

Assertion failed: ix >= 0 && ix < size

18.6.2. Порождение класса отсортированного массива

Вторая наша специализация класса Array - отсортированный подтип Array Sort. Mi поместим его определение в заголовочный файл Array S.h:



: Array<Type>( arr, sz { sort( 0,Array<Type>::

); }

ize-1 ]; }

size-1 ); clear bit(); }

TypeS operator[]( int ix )

{ set bit(); return ia[ ix ]; }

void print( ostreamS os = cout ) const

{ check bit(); Array<Type>::print( os Type min() { check bit(); return ia[ 0 ]; } Type max() { check bit(); return ia[ Array<Type>:: size-

bool is dirty() const { return dirty bit; } int find( Type ); void grow();

protected:

bool dirty bit;

#endif

Array Sort включает дополнительный член - dirty bit. Если он установлен в true, то не гарантируется, что массив по-прежнему отсортирован. Предоставляется также ряд вспомогательных функций доступа: is dirty() возвращает значение dirty bit; set bit() устанавливает dirty bit в true; clear bit() сбрасывает dirty bit в false; check bit() пересортировывает массив, если dirty bit равно true, после чего сбрасывает его в false. Все операции, которые потенциально могут перевести массив в неотсортированное состояние, вызывают set bit() .

При каждом обращении к шаблону Array необходимо указывать полный список параметров.

Array<Type>::print( os );

#ifndef ARRAY S H #define ARRAY S H

#include Array.h

template <class Type>

class Array Sort : public virtual Array<Type> { protected:

void set bit() { dirty bit = true; } void clear bit() { dirty bit = false; }

void check bit() {

if ( dirty bit ) {

sort( 0, Array<Type>:: size-1 ); clear bit();

public:

Array Sort( const Array Sort& ); Array Sort( int sz = Array<Type>::ArraySize )

: Array<Type>( sz ) { clear bit(); }

Array Sort( const Type* arr, int sz )



template <class Type> Array Sort<Type>::

Array Sort( const Array Sort<Type> &as )

: Array<Type>( as )

замечание: as.check bit() не работает! ---- объяснение см. ниже ...

if ( as.is dirty() )

sort( 0, Array<Type>:: size-1 ); clear bit();

считать списков параметров, оно такое же, как и для обычных классов:

Каждое использование имени шаблона в качестве спецификатора типа должно быть

template <class Type> Array Sort<Type>::

квалифицировано полным списком параметров. Следует писать:

AArray Sort ( const Array Sort<Type> &as )

а не

вызывает функцию-член print() базового класса Array, конкретизированного одновременно с Array Sort. Например:

Array Sort<string> sas; конкретизирует типом string оба шаблона: Array Sort и Array.

cout << sas;

конкретизирует оператор вывода из класса Array, конкретизированного типом string, затем этому оператору передается строка sas. Внутри оператора вывода инструкция

ar.print( os );

приводит к вызову виртуального экземпляра print() класса Array Sort, конкретизированного типом string. Сначала вызывается check bit() , а затем статически вызывается функция-член print() класса Array, конкретизированного тем же типом. (Напомним, что под статическим вызовом понимается разрешение функции на этапе компиляции и - при необходимости - ее подстановка в место вызова.) Виртуальная функция обычно вызывается динамически в зависимости от фактического типа объекта, адресуемого ar. Механизм виртуализации подавляется, если она вызывается явно с помощью оператора разрешения области видимости, как в Array::print() . Это повышает эффективность в случае, когда мы явно вызываем экземпляр виртуальной функции базового класса из экземпляра той же функции в производном, например в print() из класса Array Sort (см. раздел 17.5).

Функции-члены, определенные вне тела класса, помещены в файл Array S.C. Объявление может показаться слишком сложным из-за синтаксиса шаблона. Но, если не



1 ... 321 322 323 [ 324 ] 325 326 327 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика