- •Овсянник в.Н. Лабораторные работы по курсу «Объектно-ориентированное программирование»
- •1.Интегрированная среда mvs-2010
- •1.1.Методические указания
- •2.Массивушки и подпрограммочки
- •Прочитайте это задание и методические указания до конца, прежде чем терзать клавиатуру, соседа, преподавателя и пр. Сущности
- •Попробуйте сдать работу, предварительно тщательно протестировав ее на предмет отсутствия хомутов
- •2.1.Методические указания
- •3.Поиск экстремумов с ограничениями или «Брачное агенство»
- •Постановка задачи
- •Задание
- •Листинг файла mAgency.Cpp (с главной функцией)
- •Листинг файла Lib.H
- •Листинг файла Lib.Cpp
- •4.Задача «куча камней»
- •4.1.Постановка задачи.
- •4.2.Методические указания.
- •Некоторые примеры разделения камней на две кучи, которые должна решать ваша программа
- •5.Разработка простого класса
- •5.1.Задание
- •5.2.Описание вариантов заданий
- •5.3.Драгоценные методические указания
- •6.Класс вектор
- •6.1.Пример класса tVector
- •6.2.Класс tVector с перегруженными операциями
- •7.Наследование классов
- •7.1.Задание
- •7.2.Методическая помощь
- •7.3.Описание самых легких вариантов заданий
- •7.4.Контроль качества выполненной работы
- •8.Приложение с окном вида
- •9.Абстрактные классы и виртуальные функции
- •9.1.Задание
- •9.2.Методические указания
- •Void PrintClassNamе1(cBasе *pb) // параметр-указатель
- •Void PrintClassNamе2(cBasе &b) // параметр-ссылка
- •Void PrintClassNamе3(cFirst f) // параметр-значение
- •9.3.Варианты заданий
- •10.Разработка класса контейнера
- •10.1.Задание
- •10.2.Описание вариантов заданий
- •10.3.Методические указания
- •12.Перегрузка векторных и матричных операций
- •12.1.Задание
- •12.2.Бесценные методические указания
- •12.3.Некоторые особенности перегрузки операций
- •12.4.Варианты заданий
- •13.Программирование односвязного списка
- •13.1.Задание
- •13.2.Описание вариантов заданий
- •14.Приложение, основанное на модальном диалоговом окне
- •14.1.Нудные методические указания Модальные и немодальные диалоговые окна
- •Ресурсы и элементы управления
- •Сценарий создания приложения
- •Разбор приложения
- •Усовершенствование приложения
- •15.Приложения
- •15.1.Виды сортировок
- •Классификация сортировок
- •Сортировка массивов
- •15.2.Алгоритм сортировки включением
- •Пример сортировки с помощью прямого включения
- •15.3.Сортировка Шелла
- •Список литературы
6.2.Класс tVector с перегруженными операциями
Хотелось бы при работе с массивом, т.е. классом TVector, иметь возможность использовать операцию [] доступа к элементу массива по индексу для того, чтобы получить значение элемента массива или модифицировать его. Совсем не вредно, чтобы при этом класс проверял корректность индекса с тем, чтобы не было попыток выхода за границы массива. Ну и еще хотелось бы иметь возможность вывода значений всех элементов массива с помощью стандартного потока cout. Все это, и многое другое, действительно возможно выполнить с помощью перегрузки операций. Для того чтобы все эти мечты воплотить в жизнь, надо в объявление класса (файл TVector.h) добавить такие описания:
|
Если перегруженную операцию включения вектора в поток вывода ostream Вы включаете в тело класса, т.е. в файл TVector.h, то не забудьте в начале этого файла добавить директиву using namespace std. Впрочем, если Вы этого не сделаете – не страшно: компилятор выдаст сообщение об ошибке, не понимая имени ostream.
В файл реализации класса TVector.срр остается добавить реализацию функции, выполняющей перегрузку операции доступа к элементам массива по индексу:
|
Теперь в программе, использующей данный класс, можно использовать выражения такого вида:
TVector MyVec(3,5,-1);
cout<<MyVec; // вывод всех элементов массива
MyVec[k]=12.3; // присваивание значения к-тому элементу массива
ElemType Val= MyVec[k]; // получение значения к-того элемента массива
Если Вы внимательно посмотрите на функцию перегрузки операции [], то у Вас, наверное, возникнет вопрос: а что функция вернет, если индекс будет вне границ массива? А неизвестно что, т.е. случайное значение, что не есть хорошо. Ну и как же быть в этом случае? Приемлемым выходом является генерация исключительной ситуации (исключения), которую может перехватить вызывающая функция. Текст функции перегрузки операции [] можно в этом случае записать так:
|
В этом случае вызывающая функция может поступать таким образом:
try
{
// …
MyVec[i]=0;
// …
}
catch(char * Mes)
{
AfxMessageBox(Mes);
}
Если при вычислении выражения MyVec[i] индекс будет вне диапазона, выполнится оператор, указанный в блоке catch, т.е. в данном случае на дисплее будет показано окно с текстом "Bad index". Естественно, что в реальной программе для обработки такой ошибки надо реализовать что-то более целесообразное, чем вывод такого бестолкового сообщения несчастному юзеру Вашей программы.
7.Наследование классов
Если мысль не приходит в голову, она не приходит никуда
Виктор Шендерович
Цель работы – освоить разработку и использование классов-наследников для создания объектно-ориентированных программ (4 час.).
7.1.Задание
Разработайте базовый класс в соответствии с вашим вариантом задания, снабдите его конструктором с параметрами. Член-данные базового класса должны быть объявлены со спецификатором доступа protected. Для доступа к данным этого класса разработайте соответствующие функции чтения и записи их значений. Производный класс объявите со спецификатором доступа public:
class CBase {/**/};
class CChild: public CBase {/**/};
Разработайте производный класс в соответствии с вариантом задания. Снабдите его конструктором с параметрами, предназначенным для инициализации как член-данных базового класса, так и член-данных производного класса. В конструкторе производного класса вызовите конструктор базового класса.
При выполнении любого варианта задания предусмотреть такую реализацию программы, использующей разработанные вами классы, которая бы позволила убедиться в корректности реализации методов класса. В частности, во всех вариантах должна быть реализована (глобальная) функция вывода на монитор значений всех член-данных объектов.
Базовый и производный классы должны быть размещены в отдельных файлах (.h и .cpp).
В каждом варианте необходимо предусмотреть сохранение член-данных объектов в файле и чтение сохраненных данных из файла и присваивание их значений соответствующим член-данным объектам производного класса.
Варианты заданий приведены в табл.1. Разрешается выбрать свой вариант задания, но перед выполнением согласовать его содержание с преподавателем.
