С++ для начинающих



         

Порождение класса отсортированного массива - часть 3


Array_Sort( const Array_Sort<Type> &as )

а не

template <class Type>

Array_Sort<Type>::

Array_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(), обеспечить специальное поведение подтипа. Конструктор Array_Sort можно было бы инициализировать и по-другому:

// альтернативная реализация

template <class Type>

Array_Sort<Type>::

Array_Sort( const Array_Sort<Type> &as )

          : Array<Type>( as )

{

    dirty_bit = as.dirty_bit;

    clear_bit();

}

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

template <class Type>

void Array_Sort<Type>::grow()

{

    Array<Type>::grow();

    sort( 0, Array<Type>::_size-1 );

    clear_bit();

}

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




Содержание  Назад  Вперед