Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Использование итераторов для перебора элементов объекта-вектора
Изменим класс Vect так, чтобы для перебора элементов массива использовались итераторы: class Vect { private: int* p; int size; friend class VectIterator; public: ... };
Объявление VectIterator дружественным классом означает возможность доступа функциональных элементов класса VectIterator к приватным данным класса Vect. Реализация и использование итераторов для объектов типа Vect представлены на рис.6, 7.
class VectIterator{ private: Vect* pv; int curr_index; public: VectIterator(Vect& v): curr_index(0), pv(& v){} int& operator()(); }; int& VectIterator:: operator()() { if(curr_index==pv-> size) curr_index=0; return(pv-> p[curr_index++]); }
Рис.6. Итератор для класса Vect
#include < iostream> #include " Vect2.h" #include " VectIter.h" void main() { int arr1[]={10, 20, 30, 40, 50, 60, 70, 80, 90, 100}; int arr2[]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; Vect a(arr1, 10), b(arr2, 10); VectIterator next1(a), next2(b); for(int i=0; i< 10; ++i){ cout< < next1(); cout< < " \t\t"; for(int j=0; j< 10; ++j) cout< < next2(); cout< < endl; } } Рис.7. Программа VectProg2.cpp
ОБОРУДОВАНИЕ Персональный компьютер: процессор с частотой 1, 6ГГц или выше, 1024 МБ ОЗУ, жесткий диск со скоростью 5400 об/мин, видеоадаптер с поддержкой DirectX 9 и с разрешением 1280 х 1024 (или более высоким), операционная система Windows 7, интегрированные среды разработки приложений Visual Studio 2010 и Visual Studio Team System 2008 с комплектами документации MSDN, каталог Tprog\Lab4, содержащий исходные файлы проектов в подкаталогах Vect1 (Vect1.h, Vect1.cpp, Vectprog1.cpp), List1 (Str1.h, Str1.cpp, List1.h, List1.cpp, Lstprog1.cpp), List2 (Str1.h, Str1.cpp, List2.h, List2.cpp, Lstiter.h, Lstprog2.cpp), VectIterator (Vect2.h, Vectiter.h, Vect2.cpp, Vectprog2.cpp), файл Labtprog4.doc (методические указания к данной лабораторной работе), не менее 200 Mб свободной памяти на логическом диске, содержащем каталог Tprog\Lab4.
ЗАДАНИЕ НА РАБОТУ
4.1. Ознакомиться с технологией создания контейнерных объектов на неуправляемом (unmanaged) языке Visual С++ в интегрированной среде разработки приложений Visual Studio 2010 в процессе создания приложений Vect1, List1, List2, VectIterator. 4.2. Разработать и отладить объектно-ориентированную программу на неуправляемом (unmanaged) языке С++ в интегрированной среде разработки приложений Visual Studio 2010 в соответствии с заданием преподавателя. Примерами заданий могут быть следующие: 1. Написать тексты h-файлов и cpp-файлов для классов Point и Circle (окружность). Описание классов:
Разработать и отладить программу с примерами создания и использования объектов классов Point и Circle. 2. Написать тексты h-файлов и cpp-файлов для классов Point и Rect (прямоугольник). Описание классов:
Разработать и отладить программу с примерами создания и использования объектов классов Point и Rect. 3. Написать тексты h-файлов и cpp-файлов для классов Point и Rect (прямоугольник). Описание классов:
Разработать и отладить программу с примерами создания и использования объектов классов Point и Rect. 4. Разработать класс Set(множество целых чисел), позволяющие использовать их в следующей программе: Set set1(c1), set2(c1, c2), set3=set2; set1+=c1; set1+=set2; set3=set1; cout< < set3; Написать тексты h-файла и cpp-файла для классов Cicle и Set. Разработать и отладить программу создания и использования объектов классов Cicle и Set. 5. Разработать классы Complex и CArray (массив, учитывающий число занятых элементов), позволяющие использовать их в следующей программе: Complex x(2.1, 5.5), y(2.2, 5.5), z=x; x+=y; y=z; cout< < x< < y; CArray b(10), c(y), a(x, z); c.add(x); b=a; a=b+c; cout< < a; Написать тексты h-файла и cpp-файла для классов Complex и CArray. Разработать и отладить программу создания и использования объектов классов Complex и Array.
ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ
5.1. Проверить наличие на компьютере необходимого аппаратного оборудования и программного обеспечения, наличие 200 Мб свободной памяти на логическом диске, содержащем каталог Tprog\Lab4, наличие файла Labtprog4.doc и исходных файлов в подкаталогах Vect1 (Vect1.h, Vect1.cpp, Vectprog1.cpp), List1 (Str1.h, Str1.cpp, List1.h, List1.cpp, Lstprog1.cpp), List2 (Str1.h, Str1.cpp, List2.h, List2.cpp, Lstiter.h, Lstprog2.cpp), VectIterator (Vect2.h, Vectiter.h, Vect2.cpp, Vectprog2.cpp) каталога Tprog\Lab4. 5.2. Создать личный каталог, в котором будут размещаться создаваемые во время лабораторной работы проекты. 5.3. Создать в личном каталоге пустой проект Vect1 неуправляемого консольного приложения, выбирая в IDE-среде в меню File следующую последовательность опций: New-> Project-> Other Language -> Visual C++ -> Win32 -> Win32 Console Application -> Empty Project, а затем добавить в него файлы Vect1.h, Vect1.cpp, Vectprog1.cpp, предварительно выполнив копирование их в каталог Vect1/Vect1. По команде Ctrl+F5 откомпилировать проект и выполнить приложение. Проверить правильность работы приложения. 5.4. Повторить выполнение пункта 5.3 для приложений List1, List2, VectIterator. В проектах приложений List1 и List2 перед компиляцией и выполнением по Ctrl+F5 необходимо задать аргументы командной строки (например, aaaaa bbbbbb cccccc) следующим образом: выделить имя проекта в окне Solution Explorer и выбрать в меню Project последовательность опций: Properties-> Configuration Properties -> Debugging -> Command Arguments -> Edit … -> aaaaa bbbbbb cccccc -> OK. 5.5. Разработать и отладить объектно-ориентированную программу на неуправляемом (unmanaged) языке С++ в интегрированной среде разработки приложений Visual Studio 2010 в соответствии с заданием преподавателя. Если при отладке возникают проблемы с устранением ошибок в программе, необходимо выделить ошибку в окне Error List и нажать клавишу F1. В появившемся окне документации MSDN будет приведены примеры исправления ошибки.
ОФОРМЛЕНИЕ ОТЧЕТА
Отчет должен содержать: · цель работы и индивидуальное задание; · тексты исходных файлов, содержащие описание и реализацию классов, используемых в лабораторной работе; · файлы *.h и *.cpp, содержащие описание и реализацию классов в соответствии с заданием преподавателя; · текст тестовой программы и результаты работы программы; · краткая информация о механизмах включения и наследования.
КОНТРОЛЬНЫЕ ВОПРОСЫ
7.1. Какие классы называются контейнерными? 7.2. Почему недостаточно использовать функцию-элемент next() для отслеживания элементов контейнерного объекта? 7.3. Какую функцию-элемент класса обычно заменяют на операторную функцию operator()()? 7.4. Чем различается реализация операторных функций operator()() для классов Vect и List? 7.5. Укажите назначение итераторов. 7.6. Почему класс итератора должен быть дружественным для контейнерного класса? 7.7. Чем отличаются итераторы классов List и Vect?
БИБЛИОГРАФИЧЕСКИЙ СПИСОК
1. Подбельский, В.В. Язык Си+: учеб.пособие для вузов / В.В.Подбельский.— 5-е изд. — М.: Финансы и статистика, 2007 (2001, 2002, 2003, 2004, 2005, 2006).— 560с.: ил. 2. Павловская, Т.А. C/C++: Программирование на языке высокого уровня: учебник для вузов / Т.А.Павловская.— М.[и др.]: Питер, 2007 (2002, 2003, 2004, 2005, 2006).— 461с.: ил.3. Гарнаев А.Ю. Самоучитель Visual Studio.Net 2003. – СПб.: БХВ-Петербург, 2003. – 688 с. 3. Шилдт, Г. C+: базовый курс / Г.Шилдт; пер.с англ.и ред.Н.М.Ручко.— 3-е изд. — М.[и др.]: Вильямс, 2007 (2005).— 624с.: ил.5. Уоткинз Д., Хаммонд М., Эйбрамз Б. Программирование на платформе.NET. – М.: Издательский дом " Вильямс", 2003. – 368 с. 4. MSDN 2010. Электронная документация Microsoft для разработчиков программного обеспечения. – 500000 с. ЛАБОРАТОРНАЯ РАБОТА N 5 Наследование в объектно-ориентированных программах на языке С++
ЦЕЛЬ И ЗАДАЧИ РАБОТЫ
Ознакомление с работой механизма наследования при различных способах управления доступом, с использованием явных и неявных преобразований типов данных при наследовании, а также с правилами доступа к функциям-элементам базового и производного классов.
ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ
Определение типа Arr_bnd посредством наследования В рассмотренных ранее абстрактных типах использовалось включение одних объектов в другие (составные) объекты. При этом составной объект имел возможность, при необходимости, расширить свою функциональность за счет вызова методов внутреннего объекта. При такой перегрузке внутренний объект как бы делегировал свою функциональность внешнему (составному) объекту. Другой способ создания составных объектов – создание объектов через механизм наследования. Наследование - это создание нового класса из старого или, по другому, создание нового классового типа из другого классового типа. При использовании наследования к существующему (базовому) классу делается как бы надстройка в виде нового (производного) класса. Производный класс полностью или выборочно наследует описание базового класса, дополняя его своим описанием. Базовый класс может наследоваться как общедоступный (public) и как приватный (private) базовый класс. В первом случае новый класс является расширением базового класса, в то время как во втором случае новый класс реализует специализацию базового класса. В качестве примера используем разработанный ранее класс безопасного массива Array, обеспечивающего контроль выхода индексов за границы массива, и расширим этот тип до безопасного массива с динамическими пределами - верхним и нижним. Такой стиль объявления массива более гибок и позволяет индексам непосредственно соответствовать прикладной области. Например, если новый (производный) класс - Arr_bnd, а индексы массива должны изменяться в диапазоне от 100 до 150, то такой контейнерный объект можно будет породить следующим образом: Arr_bnd a(100, 150); На рис.1 приведены описания базового класса Array и производного класса Arr_bnd. Запись class Arr_bnd: public Array означает, что класс Array наследуется производным классом как общедоступный базовый класс.
class Array { private: int size; protected: int* pa; public: Array(int sz) { pa=new int[size=sz]; } virtual ~Array() { delete [] pa; } int& operator[](int); void operator=(Array& ); Array& operator+(Array& ); friend ostream & operator< < (ostream &, Array & ); }; class Arr_bnd: public Array{ private: int l_bnd, r_bnd; public: Arr_bnd(); Arr_bnd(int, int); int& operator[](int); };
Рис 1. Определение типа Arr_bnd посредством наследования
Конструкторы производного класса будут содержать вызов конструктора базового класса: Arr_bnd:: Arr_bnd(): Array(10) { l_bnd=0; r_bnd=9; } Arr_bnd:: Arr_bnd(int lb, int rb): Array(rb-lb+1) { l_bnd=lb; r_bnd=rb; } Необходимо отметить, что конструктор базового класса всегда будет выполняться до инициализации полей данных, объявленных в производном классе. Например, в следующем варианте реализации конструктора производного класса используется список инициализации, в котором вызов конструктора базового класса находится в конце списка. Однако компилятор С++ в первую очередь найдет и обработает вызов конструктора Array, a уже затем выполнит инициализацию l_bnd и r_bnd:
Arr_bnd:: Arr_bnd(int lb, int rb): l_bnd(lb), r_bnd(rb), Array(rb-lb+1){}
Перегрузка оператора индексации [] для класса Arr_bnd связана с необходимостью доступа из операторной функции производного класса к элементу данных Array:: pa наследуемого базового класса. Указание вида доступа protected для элемента pa в классе Array обеспечивает доступ к этому элементу в производном классе: int& Arr_bnd:: operator[](int i) { if(i< l_bnd||i> r_bnd){ cerr< < " Выход за границу диапазона\n"; exit(1); } return(pa[i-l_bnd]); } Отметим, что для класса Arr_bnd можно не перегружать операции сложения и присваивания, поскольку в первом случае часть необходимых действий выполняет наследуемая операторная функция operator+(), а во втором случае дополнительно к действиям, выполняемым функцией operator=() базового класса, будет выполняться автоматическое копирование полей l_bnd и r_bnd производного класса. На рис. 2 представлен пример использования классового типа Arr_bnd.
#include < iostream> #include < iomanip> #include " Arrbnd.h" void main(){ int i; Arr_bnd a(101, 105), b(101, 105), c(201, 205); for(i=1; i< 6; i++){ a[i+100]=i; b[i+100]=i+100; } c=a; Array d(5); d=b+c; cout< < " c="; for(i=101; i< 106; i++) cout< < setw(6)< < c[i]; cout< < endl< < " a="; for(i=101; i< 106; i++) cout< < setw(6)< < a[i]; cout< < endl; cout< < d< < endl; } Рис 2. Тестовая программа для типа Arr_bnd
Если изменить тип базового класса Array с общедоступного на приватный, то пользователи типа Arr_bnd не смогут обратиться к элементам общедоступного раздела базового класса (к операторным функциям operator+() и operator=() ) и, следовательно, для операторов
с=а; d=b+c;
программы на рис.2 компилятор выдаст сообщение об ошибке доступа. Популярное:
|
Последнее изменение этой страницы: 2016-05-03; Просмотров: 757; Нарушение авторского права страницы