Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Использование итераторов для перебора элементов объекта-вектора



Изменим класс 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 x, y Конструкторы, функции move, assign, print
Circle p (типа Point), r Конструкторы, функция square, операции =, +=, < <

Разработать и отладить программу с примерами создания и использования объектов классов Point и Circle.

2. Написать тексты h-файлов и cpp-файлов для классов Point и Rect (прямоугольник). Описание классов:

Класс Элементы данных Интерфейс
Point x, y Конструкторы, функции move, print, операции =, +=, ==
Rect p1, p2(типа Point) Конструкторы, функции move, square, операции =, <, < <

Разработать и отладить программу с примерами создания и использования объектов классов Point и Rect.

3. Написать тексты h-файлов и cpp-файлов для классов Point и Rect (прямоугольник). Описание классов:

Класс Элементы данных Интерфейс
Point x, y Конструкторы, операции +=, =, < <
Rect p1(типа Point) dx, dy Конструкторы, friend-функции move, square, операции =, ==, print

Разработать и отладить программу с примерами создания и использования объектов классов 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. Чем различается реализация операторных функций opera­tor()() для классов 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 можно не перегружать опера­ции сложения и присваивания, поскольку в первом случае часть не­обходимых действий выполняет наследуемая операторная функция ope­rator+(), а во втором случае дополнительно к действиям, выполняе­мым функцией 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; Просмотров: 704; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.069 с.)
Главная | Случайная страница | Обратная связь