|
Программирование >> Инициализация объектов класса, структура
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. (Разумеется, мы реализовали такое поведение только в целях демонстрации.)
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |