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



         

Порождение класса, контролирующего выход за границы массива - часть 2


#include "Array_RC.h"

#include "Array.C"

#include <assert.h>

template <class Type>

Array_RC<Type>::Array_RC( const Array_RC<Type> &r )

       :  Array<Type>( r ) {}

template <class Type>

Array_RC<Type>::Array_RC( const Type *ar, int sz )

       :  Array<Type>( ar, sz ) {}

template <class Type>

Type &Array_RC<Type>::operator[]( int ix ) {

        assert( ix >= 0 && ix < Array<Type>::_size );

        return ia[ ix ];

}

Мы квалифицировали обращения к членам базового класса Array, например к _size, чтобы предотвратить просмотр Array до момента конкретизации шаблона:

Array<Type>::_size;

Мы достигаем этого, включая в обращение параметр шаблона. Таким образом, имена в определении Array_RC разрешаются тогда, когда определяется шаблон (за исключением имен, явно зависящих от его параметра). Если встречается неквалифицированное имя _size, то компилятор должен найти его определение, если только это имя не зависит явно от параметра шаблона. Мы сделали имя _size зависящим от параметра шаблона, предварив его именем базового класса Array<Type>. Теперь компилятор не будет пытаться разрешить имя _size до момента конкретизации шаблона. (В определении класса Array_Sort мы приведем другие примеры использования подобных приемов.)

Каждая конкретизация Array_RC порождает экземпляр класса Array. Например:

Array_RC<string> sa;

конкретизирует параметром string как шаблон Array_RC, так и шаблон Array. Приведенная ниже программа вызывает try_array() (реализацию см. в разделе 16.13), передавая ей объекты подтипа Array_RC. Если все сделано правильно, то выходы за границы массивы будут замечены:

#include "Array_RC.C"

#include "try_array.C"

int main()

{

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

    cout << "конкретизация шаблона класса Array_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

   6, 3, 27, 3 >

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




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