Программирование >>  Формирование пользовательского контейнера 

1 ... 104 105 106 [ 107 ] 108 109 110 ... 156


tetnplate<class T, class Allocator>

bool operator<=(const RangeArray<T, Allocator> &a,

const RangeArray<T, Allocator> &b)

return !(a > b) ;

tennplate<class T, class Allocator> bool operator>=(const RangeArray<T, Allocator> &a, const RangeArray<T, Allocator> &b)

return ! (a < b) ;

Как отмечено в комментариях в начале листинга 8.1, следует весь код поместить в файл с именем ra.h. Он будет использоваться в программах-примерах, приведенных далее.

Код листинга 8.1 содержит два класса. Первый - raexc - класс-исключение. Этот тип исключения генерируется, если делается попытка создать объект RangeArray С некорректно заданными границами, например, если нижняя граница больше верхней. Второй - RangeArray - класс контейнера, его мы обсудим подробно в следующих разделах.

Подробно о классе RangeArray

Как и у всех встроенных в библиотеку STL последовательных контейнеров, описание класса RangeArray начинается со спецификации шаблона: tenplate<class Т, class Allocator = allocator<T> >

т - ТИП данных, хранящихся в контейнере, а Allocator - стандартный, установленный по умолчанию распределитель памяти.

return lexicographical conpare(а.begin(), а.end(), b.beginO. b.endO);

tenplate<class T, class Allocator> Ipool operator> (const RangeArray<T, Allocator> &a, const RangeArray<T, Allocator> &b)

return b < a;



328 {ладае

Члены класса с уровнем доступа private

Описание массива класса RangeArray начинается со следующих объявлений со спецификацией private:

Т *arrayptr; указатель на базовый массив контейнера

tinsigned len; хранит длину контейнера int upperbotind; нижняя граница int lowerbotind; верхняя граница

Allocator а; распределитель памяти

Указатель arrayptr хранит ссылку на участок памяти, который будет содержать массив элементов типа т. В этом фрагменте памяти разместятся элементы, входящие в состав объекта типа RangeArray. Описанный массив индексируется как обычно, с отсчетом от нуля. Индексы объекта RangeArray будут преобразовываться в индексы массива с отсчетом от нуля, на который ссылается указатель arrayptr.

Текущая длина объекта RangeArray хранится в поле len. Верхняя и нижняя границы - в полях upperbound и lowerbound соотвстствснно. При описании класса RangeArray НОЛЬ считается положитсльной всличиной. Распределитель памяти для контейнера запоминается в поле а.

Определения требуемых типов

За описанием членов класса с уровнем доступа private следуют приведенные далее различные определения со спецификатором typedef, обязательные для всех последовательных контейнеров. Спецификаторы typedef, необходимые для контейнера, typedef Т value type; typedef Allocator allocator type; typedef typename Allocator::reference reference; typedef typename Allocator::const reference const reference; typedef typename Allocator::size type size type; typedef typename Allocator::difference type difference type; typedef typename Allocator::pointer pointer; typedef typename Allocator::const pointer const pointer;

Итераторы прямого направления.

typedef Т * iterator; ,

typedef const T * const iterator;



Эти определения подобны применяемым во встроенных контейнерах библиотеки STL. Обратите внимание на то, что итераторы прямого направления - это просто указатели на объекты типа т. Для класса RangeArray этого достаточно, но могут быть более сложные контейнеры. Кроме того, не предусмотрены итераторы обратного направления, вы можете попробовать добавить их.

Конструкторы и деструктор класса RangeArray

Для увеличения гибкости создаваемого контейнера следует в его описание включить описанные ранее четыре варианта конструкторов, предусмотренных для последовательных контейнеров. В классе RangeArray также описан пятый конструктор, позволяющий создавать массив заданного диапазона. Далее приведено описание конструкторов. Конструктор, заданный по умолчанию. RangeArray О {

upperbotind = lowerboxmd = 0; len = 0;

arrayptr = a.allocate{0);

Конструирует массив заданного диапазона

с указанием начального значения каждого элемента.

tatplate <class Т. class А>

RangeArray<T, А>::RangeArray(int low, int high, const T &t)

if(high <= low) throw RAExc( Invalid Range ); high++;

Сохраняет границы, upperbotind = high; lowerbotind = low;

Выделяет память для контейнера, arrayptr = а.allocate(high - low);

Сохраняет длину контейнера, len = high - low;



1 ... 104 105 106 [ 107 ] 108 109 110 ... 156

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