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



         

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


template <class Type>

int Array_Sort<Type>::find( const Type &val )

{

     int low = 0;

     int high = Array<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;

}

Протестируем нашу реализацию класса 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, 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           возвращенный индекс: -1

Memory fault (coredump)

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




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