|
Программирование >> Формирование пользовательского контейнера
Текущее значение адреса содержится в переменной ptr. Адрес начала массива хранится в переменной begin, а адрес элемента, следующего за последним, - в переменной end. Размер массива указывается в переменной length. В классе iter определены два конструктора, приведенные далее. Первый - конструктор по умолчанию. Второй создает объект iter, задавая начальное значение переменной ptr и указатели на начало и конец массива. IterO { ptr = end = begin = NULL; length = 0; Iter{T *p, T *first, T *last) { ptr = p; end = last; begin = first; length = last - first; Б профамме сборщика мусора, приведенной в этой главе, начальное значение переменной ptr всегда равно значению переменной begin. Но вы можете создавать объекты типа iter с другим начальным значением. Для того чтобы объекты класса iter могли вести себя подобно указателям, в классе перефужены операции: * и ->, и операция индексирования [ ], их код приведен далее. Возвращает значение, на которое указывает ptr. Не разрешает выход за пределы диапазона. Т boperator*{) { if{ (ptr >= end) I I (ptr < begin) ) throw OutOfRangeExc(); return *ptr; Возвращает адрес, содержащийся в ptr. Не разрешает выход за пределы диапазона. *operator-> () { if( (ptr >= end) I I (ptr < begin) ) throw OutOfRangeExc(); return ptr; II Возвращает ссылку на объект с заданным индексом. Не разрешает выход за пределы диапазона. Т &operator[](int i) { if( (i < 0) II (i >= (end-begin)) ) throw OutOfRangeExc(); return ptr[i]; Операция * возвращает ссылку на указываемый элемент массива. Операция -> возвращает адрес этого элемента. Операция [ ] возвращает ссылку на элемент, индекс которого задан. Обратите внимание на то, что описанные операции не допускают выхода за фаницы массива. При любой подобной попытке генерируется исключение класса outofRangeExe. В классе iter определены различные арифметические операции с указателями, такие как: ++, ~ и т. д., которые изменяют объект iter. Эти операции позволят вам в цикле обрабатывать размещенный в динамической памяти массив. Для сохранения высокой скорости выполнения ни одна из арифметических операций не обрабатывает самостоятельно выход за фаницы массива. Однако любая попытка обратиться к элементу, находящемуся за пределами этих фаниц, сгенерирует исключение, которое препятствует возникновению ощибки. В классе iter определены также операции отнощения. Операции отношения, как и арифметические операции, просты и понятны. В классе iter описана функция-утилита sizeO, которая возвращает размер массива, на который указывает объект iter. Как уже отмечалось ранее, в классе GCPtr с помощью спецификатора typedef задан синоним ссiterator типа iter<T> дня каждого экземпляра класса, упрощающий объявление итератора. Это означает, что дня применения итератора класса iter в любом объекте типа GCPtr вы можете использовать имя типа CGIterator. Правила использования класса GCPtr Применять объекты класса GCPtr очень просто. Сначала подключите файл gc.h. Затем объявите объект GCPtr, указав тип данных, на которые он будет указывать. Например, для декларации объекта р типа GCPtr, который может указывать на данные типа int, используйте следующее объявление: GCPtr<int> р; р может указывать на объекты типа int 1г 2.2. Пример использования объекта GCPtr ♦include <iostream> ♦include <new> ♦include gc.h using namespace std; int mainO ( GCPtr<int> p; try { P = new int; } catch(bad alloc exc) { cout Allocation failure!\n ; В таком случае описанную программу правильнее было бы назвать диспетчером распределения динамической памяти, а не сборщиком мусора. - Пер. Затем динамически выделите память, применив операцию new, и присвойте переменной р указатель, возвращаемый операцией new, как показано далее. р S new int; р присваивается адрес объекта типа int Вы можете присвоить значение объекту, размещенному в динамической памяти с помощью подобной операции присваивания: *р 88; присваивается значение объекту типа int Конечно, можно применить комбинацию приведенных ранее операторов, как показано далее. GcPtr<int> р = new int(88); объявление и инициализация Вы можете получить числовое значение объекта типа int, на который указывает объект р, с помощью следующего оператора: int к = *р; Как видно их приведенных примеров, в основном вы используете объект типа GCPtr как обычный указатель языка С++. Отличие лищь в том, что вам не нужно удалять такой указатель после заверщения работы с ним. Память, отведенная этому указателю, будет очищена автоматически, когда она больше не понадобится. В листинге 2.2 приведена профамма, объединяющая фрагменты, описанные ранее.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |