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

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


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

AArray Sort<Type>( ошибка: это не спецификатор типа

поскольку второе вхождение Array Sort синтаксически является именем функции, а не спецификатором типа.

if ( as.is dirty() )

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

sort( 0, size );

а не просто

as.check bit();

Первая причина связана с типизацией: check bit() - это неконстантная функция-член, которая модифицирует объект класса. В качестве аргумента передается ссылка на константный объект. Применение check bit() к аргументу as нарушает его константность и потому воспринимается компилятором как ошибка.

Вторая причина: копирующий конструктор рассматривает массив, ассоциированный с as, только для того, чтобы выяснить, нуждается ли вновь созданный объект класса Array Sort в сортировке. Напомним, однако, что член dirty bit нового объекта еще не инициализирован. К началу выполнения тела конструктора Array Sort инициализирован! только члены ia и size, унаследованные от класса Array. Этот конструктор должен с помощью clear bit() задать начальные значения дополнительных членов и, вызвав sort() , обеспечить специальное поведение подтипа.

альтернативная реализация template <class Type> Array Sort<Type>::

Array Sort( const Array Sort<Type> Sas ) : Array<Type>( as )

dirty bit = as.dirty bit; clear bit();

Конструктор Array Sort можно было бы инициализировать и по-другому:

Ниже приведена реализация функции-члена grow() .1 Наша стратегия состоит в том, чтобы воспользоваться имеющейся в базовом классе Array реализацией для выделения дополнительной памяти, а затем пересортировать элементы и сбросить dirty bit:

1 Здесь есть потенциальная опасность появления висячей ссылки, если пользователь сохранит адрес какого-либо элемента исходного массива перед тем, как grow() скопирует массив в новую область памяти. См. статью Тома Каргилла в [LIPPMAN96b].



template <class Type>

d Array Sort<Type>::grow()

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

template <class Type>

int Array Sort<Type>::find( const Type Sval ) {

int low = 0;

int high = AArray<Type>:: size-1; check bit(); while ( low <= high ) {

int mid = ( low + high )/2;

if ( val == ia[ mid ] ) return mid;

if ( val < ia[ mid ] )

high = mid-1; else low = mid+1;

return -1;

Так выглядит реализация двоичного поиска в функции-члене find() класса Array Sort:

Протестируем нашу реализацию класса Array Sort с помощью функции try array() . Показанная ниже программа тестирует шаблон этого класса для конкретизаций типами int и string:



#include Array S.C #include try array.C

#include <string>

main()

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

Eeyore , Pooh , Tigger , Piglet , Owl , Gopher , Heffalump

Array Sort<int> iA( ia,10 ); Array Sort<string> SA( sa,7 );

cout << ёНёбабёдабёу ёёаппа Array Sort<int>

<< endl; try array( iA );

cout << ёНёбабёдабёу ёёаппа Array Sort<string>

<< endl; try array( SA );

return 0;

При конкретизации типом string после компиляции и запуска программа печатает следующий текст (обратите внимание, что попытка вывести элемент с индексом -1 заканчивается крахом):

конкретизация класса Array Sort<string>

try array: начальные значения массива

7 )< Eeyore, Gopher, Heffalump, Owl, Piglet, Pooh

Tigger >

try array: после присваиваний ( 7 )< Eeyore, Gopher, Owl, Pi

Gopher, Owl, Piglet, Pooh, Pooh Pooh >

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

( 7 )< Eeyore, Gopher, Owl, Piglet, Pooh, Pooh

Pooh >

try array: после почленного копирования

( 7 )< Eeyore, Piglet, Owl, Piglet, Pooh, Pooh

Pooh >

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

( 7 )< <empty>, <empty>, <empty>, <empty>, Eeyore, Owl Piglet, Piglet, Pooh, Pooh, Pooh >

искомое значение: Tigger Memory fault (coredump)

возвращенный индекс: -1

После почленного копирования массив не отсортирован, поскольку виртуальная функция вызывалась через объект, а не через указатель или ссылку. Как было сказано в разделе 17.5, в таком случае вызывается экземпляр функции из класса именно этого объекта, а не того подтипа, который может находиться в переменной. Поэтому функция sort() никогда не будет вызвана через объект Array. (Разумеется, мы реализовали такое поведение только в целях демонстрации.)



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

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