|
Программирование >> Формирование пользовательского контейнера
2.6. Демонстрация применения итератора ♦include <iostream> ♦include <new> ♦include gc.h using namespace std; int mainO { try { Создает объект GCPtr для динамически размещенного массива из 10 элементов типа int. GCPtr<int, 10> ар = new int[10]; Объявляет итератор типа int. GCPtr<int>::GCiterator itr; Присваивает itr указатель на начало массива, itr = ap.beginO ; Используя индексирование массива, присваивает его элементам некоторые значения. for(unsigned i=0; i < itr.sizeO; i++) itr[i] = i; Применение итераторов р[цдексирование массива - очень удобный способ циклической обработки массива, размещенного в динамической памяти, но не единственный имеющийся в ващем распоряжении. Во многих приложениях лучще воспользоваться итератором, потому что он избавляет от возможного выхода за границы массива. Напоминаю, что для класса GCPtr итераторами служат объекты типа iter. Класс iter поддерживает все операции с указателями, например, такие как ++. Он также предоставляет возможность индексирования итератора как массива. В листинге 2.6 приведен вариант программы листинга 2.5 с применением итератора. Учтите, легче всего получить итератор для объекта типа ccptr с помощью синонима cciterator, описанного спецификатором typedef внутри класса ccptr и автоматически связываемого с базовым типом т. и Перемещается внутри массива с помощью итератора. for(itr = ар.beginO; itr != ap.endO; itr++) cout *itr ; cout endl; } catch(bad alloc exc) { cout Allocation failure!\n ; return 1; } catch(OutOfRangeExc exc) { cout Out of range access!\n ; return 1; return 0; Попробуйте увеличить итератор настолько, чтобы он указывал за границу размещенного массива. Затем попытайтесь получить доступ к значению элемента, находящегося за границей массива. Вы увидите, что будет генерироваться исключение типа OutOfRangeExc. Обычно изменять итератор можно любым предпочитаемым вами способом, не вызывая генерации исключения. Однако если он вдруг укажет на память вне границ базового массива, и вы попытаетесь получить или задать значение этого элемента, возникнет ощибка выхода за границы. Использование объекта GCPtr с классами Объект типа GCPtr применяется для указания на классы так же, как на встроенные типы. В листинге 2.7 приведена программа, размещающая в динамической памяти объекты типа MyClass. Листинг 2.7. Использование объекта типа ocptr с классами # include <iostreain> #include <new> #include gc.h using namespace std; class MyClass { int а, b; public: double val; llyClassO { a = b = 0; } 14yClass(int X, int y) { a = x; b = y; val = 0.0; -MyClassO { cout Destructing MyClassC a b )\n ; int sumO { return a + b; friend ostream &operator (ostream bstrm, MyClass &obj); Перегруженная вставка (inserter) в поток вывода для отображения полей класса MyClass. ostream &cer а tor (ostream &strm. MyClass &obj) { strm ( obj.a obj.b ) ; return strm; intmainO { try { GCPtr<MyClass> ob = new MyClass (10, 20); Отображение значения с помощью перегруженной вставки в поток вывода. cout оЬ endl;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |