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

1 ... 168 169 170 [ 171 ] 172 173 174 ... 395


---- primer.h ----namespace cplusplus primer

определение шаблона скрыто в пространстве имен template <class Type>

Type min( Type* array, int size ) { /* ... */ }

---- user.C ----

#include <primer.h>

int ai[4] = { 12, 8, 73, 45 };

int main() {

int size = sizeof(ai) / sizeof(ai[0]);

ошибка: функция min() не найдена min( &ai[0], size );

using cplusplus primer::min; using-объявление

правильно: относится к min() в пространстве имен cplusplus primer

min( &ai[0], size

Что произойдет, если наша программа использует шаблон, определенный в пространстве имен, и мы хотим предоставить для него специализацию? (Явные специализации шаблонов рассматривались в разделе 10.6.) Допустим, мы хотим использовать шаблон min() , определенный в cplusplus primer, для нахождения минимального значения в массиве объектов типа SmallInt. Однако мы осознаем, что имеющееся определение шаблона не вполне подходит, поскольку сравнение в нем выглядит так:

if ( array[i] < min val )

В этой инструкции два объекта класса SmallInt сравниваются с помощью оператора <. Но этот оператор неприменим к объектам, если только не перегружен в классе SmallInt (м1 покажем, как определять перегруженные операторы в главе 15). Предположим, что мы хотели бы определить специализацию шаблона min() , чтобы она пользовалась

функция сравнения объектов SmallInt возвращает true, если parm1 меньше parm2

функцией comipareLess() для сравнения двух подобных объектов. Вот ее объявление:

bool compareLess( const SmallInt &parm1, const SmallInt &parm2 );

Как должно выглядеть определение этой функции? Чтобы ответить на этот вопрос, необходимо познакомиться с определением класса SmallInt более подробно. Данный класс позволяет определять объекты, которые хранят тот же диапазон значений, что и 8-разрядный тип unsigned char, т.е. от 0 до 255. Дополнительная функциональность состоит в том, что класс перехватывает ошибки переполнения и потери значимости. Во всем остальном он должен вести себя точно так же, как unsigned char. Определение SmiallInt выглядит следующим образом:



конструктор класса SmallInt

SmiallInt. Класс также содержит конструктор с параметром ival:

SmallInt( int ival ) : value( ival ) {}

Его единственное назначение - инициализировать член класса value значением ival.

Вот теперь можно ответить на ранее поставленный вопрос: как должна быть определена функция compareLess() ? Она будет сравнивать члены value переданных ей аргументов

возвращает true, если parm1 меньше parm2

bool compareLess( const SmallInt &parm1, const SmallInt &parm2 ) { return parm1.value < parm2.value;

типа SmallInt:

Заметим, однако, что член value является закрытым. Как может глобальная функция обратиться к закрытому члену, не нарушив инкапсуляции класса SmallInt и не вызвав тем самым ошибку компиляции? Если вы посмотрите на определение класса SmallInt, то заметите, что глобальная функция compareLess() объявлена как дружественная (friend). Если функция объявлена таким образом, то ей доступны закрытые члены класса. (Друзья классов рассматриваются в разделе 15.2.)

Теперь м1 готовы определить специализацию шаблона miin(). Она следующим образом

специализация min() для массива объектов SmallInt template<> SmallInt min<smallInt>( SmallInt* array, int size )

LlInt min val = array[0]; (int i = 1; i < size;

SmallInt for (int

при сравнении используется функция compareLess() if ( compareLess( array[i], min val ) ) min val = array[i];

print( Iinimum value found: ); print( min val );

return min val;

использует функцию compareLess() .

class SmallInt { public:

SmallInt( int ival ) : value( ival ) {}

friend bool compareLess( const SmallInt &, const SmallInt & ); private:

int value; член

В этом классе есть один закрытый член value, в котором хранится значение объекта типа



---- primer.h ----namespace cplusplus primer

определение шаблона скрыто в пространстве имен template <class Type>

Type min( Type* array, int size ) { /* ... */ }

---- user.h ----class SmallInt { /* ... */ };

void print( const SmallInt & );

bool compareLess( const SmallInt &, const SmallInt & );

---- user.C ----

#include <primer.h>

#include user.h

ошибка: это не специализация для cplusplus primer::min() template<> SmallInt min<smallInt>( SmallInt* array, int size )

{ /* ... */ }

Где мы должны объявить эту специализацию? Предположим, что здесь: ...

К сожалению, этот код не работает. Явная специализация шаблона функции должна быть объявлена в том пространстве имен, где определен порождающий шаблон. Поэтому мы обязаны определить специализацию min() в пространстве cplusplus primer. В нашей программе это можно сделать двумя способами.

Напомним, что определения пространства имен не обязательно непрерывны. М1 можем

---- user.C ----

#include <primer.h> #include user.h

namespace cplusplus primer {

специализация для cplusplus primer::min()

template<> SmallInt min<smallInt>( SmallInt* array, int size )

{ /* ... */ }

SmallInt asi[4];

int main() {

задать значения элементов массива asi с помощью функции-члена set()

using-объявление 1 1 т.+- \ .

using cplusplus primer::min; int size = sizeof(asi) / sizeof(SmallInt); конкретизируется min(SmallInt*,int) min( &asi[0], size );

повторно открыть пространство имен cplusplus primer для добавления специализации:

Можно определить специализацию так, как мы определяем любой другой член пространства имен вне определения самого пространства: квалифицировав имя члена именем объемлющего пространства.



1 ... 168 169 170 [ 171 ] 172 173 174 ... 395

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