- •Овсянник в.Н. Лабораторные работы по курсу «Объектно-ориентированное программирование»
- •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.Сортировка Шелла
- •Список литературы
5.3.Драгоценные методические указания
Шаг 1. Создание каркаса консольного приложения. Создайте консольное приложение с поддержкой MFC. В данном сценарии предполагается, что вы нарекли проект именем SmpCL. но вы вправе выбрать любое другое.
Шаг 2. Добавление в проект заготовки собственного класса. Выберите для своего класса имя в соответствии с его функциональностью, т.е. с вашим вариантом задания. Рекомендуется имя класса начинать с буквы С. Предположим, что вы назвали класс CMyCls. Выполните команду ProjectAdd Class и в появившемся окне (рис.2.1) выберите С++ в ветви Visual C++, врежьте по Add.
|
Рис. 2.1. Окно добавления нового класса в проект
В новом появившемся окне (рис. 2.2) введите имя своего класса в поле Class name. Обратите внимание, что по умолчанию MVS генерирует имена файлов MyCls.h и MyCls.cpp (заголовочный файл и файл реализации) путем отбрасывания первого символа имени класса. Если хотите запутать себя и возможных читателей текста вашей программы – измените имена файлов, а если нет – придавите кнопку Finish.
|
Рис. 2.2. Ввод имени файла
Мастер ИС сгенерирует и включит в состав проекта два файла.
Заголовочный файл MyCls.h
-
#pragma once
class CMyCls
{
public:
CMyCls(void);
~CMyCls(void);
};
содержит только директиву препроцессора #pragma once, предотвращающую ошибки компиляции (точнее, ошибки сборки приложения) при повторном включении этого файла в проект, и объявления конструктора и деструктора класса. В этот файл вы будете добавлять описания член-данных и член-функций классов в соответствии со своим любимым вариантом задания.
Файл реализации MyCls.cpp
-
#include "StdAfx.h"
#include "MyCls.h"
CMyCls::CMyCls(void)
{
}
CMyCls::~CMyCls(void)
{
}
содержит минимально необходимые директивы препроцессора и заготовки конструктора и деструктора. Если в дальнейшем вам понадобится включать в этот файл другие директивы препроцессора – добавляйте их после директивы #include "MyCls.h".
Шаг 3. Создание объекта класса. Несмотря на то, что класс добавлен в проект, мы не сможем создать и использовать ни одного объекта этого класса, пока не подключим файл MyCls.h к тому файлу приложения, в котором мы намереваемся создавать объекты этого гениального класса. Для нашего случая консольного приложения таким файлом будет SmpCL.cpp, в котором находится функция _tmain().
Добавим в этот файл директиву:
// SmpCL.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "SmpCL.h"
#include "MyCls.h" // добавление
В этом же файле в функцию _tmain() добавим определение объекта класса:
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
_tprintf(_T("Fatal Error: MFC initialization failed\n"));
nRetCode = 1;
}
else
{
CMyCls obj;
getchar();
}
return nRetCode;
}
Для того чтобы убедиться в том, что объект класса действительно создается и уничтожается, поставьте точки прерывания в конструкторе и деструкторе своего класса и выполните трассировку программы. Заметили, когда вызываются конструктор и деструктор?
Проделайте подобные операции для случая, когда объект класса создается в динамической памяти:
{
CMyCls *pobj;
pobj=new CMyCls;
delete pobj;
getchar();
}
Шаг 4. Добавление в класс член-данных и член-функций. Это действо можно выполнить как «вручную», так и с помощью мастера ИС. Рассмотрим последний случай.
Выполните команду ViewClass View (рис. 2.3), в появившемся окне щелкните знак + слева от имени проекта и, о чудо!, вы увидите имя своего класса. Щелкните ЛКМ по имени своего класса и в нижней части окна вы увидите компоненты класса, в данном случае только конструктор и деструктор.
|
Рис. 2.3. Вкладка Class View в окне решений
Для добавления в класс член-данного выделите имя класса мышкой и вызовите для него контекстное меню (как обычно, с помощью ПКМ). В этом меню последовательно выберите команду Add и далее Add Variable. В появившемся окне (рис.2.4) выберите protected в списке Access, тип член-данного в поле Variable type, задайте имя переменной в поле Variable name и комментарий к ней в поле Comment. Вытрите пот со лба и давите Finish!
|
Рис. 2.4. Добавление в класс член-данного
Заметьте, что в нижней части окна Class View появилось имя член-данного и перед ним желтый значок ключика (что бы это значило?). При этом содержимое файла MyCls.h стало таким:
-
#pragma once
class CMyCls
{
public:
CMyCls(void);
~CMyCls(void);
protected:
// число кроликов на кв. метр
int RabbitCount;
};
Чудесным образом изменился и файл MyCls.cpp:
-
#include "StdAfx.h"
#include "MyCls.h"
CMyCls::CMyCls(void)
: RabbitCount(0)
{
}
CMyCls::~CMyCls(void)
{
}
В конструктор класса добавлена инициализация член-данного RabbitCount нулевым значением, что можно и изменить в случае надобности.
Аналогично добавлению член-данного добавим функцию, которая позволит получить значение этого член-данного (рис. 2.5) и записать его (рис. 2.6).
Важное замечание: когда будете создавать функцию записи значения член-данного, не забудьте нажать кнопку Add после ввода имени формального параметра. Обратите внимание, что после этого действа тип и имя формального параметра появятся в окошке Parameter list (рис. 2.6) как черт из коробочки.
|
Рис. 2.5. Добавление функции чтения член-данного
|
Рис. 2.6. Добавление функции записи значения член-данного
К сожалению, мастер ИС MVS не может догадаться, какой код надо поместить в созданные им заготовки функций, и поэтому нам придется сделать это вручную, например, так:
-
int CMyCls::get_RabbitCount(void)
{
return RabbitCount;
}
bool CMyCls::set_RabbitCount(int newValue)
{
if(newValue<0) return false;
RabbitCount=newValue;
return true;
}
Вы можете полюбоваться диаграммой своего класса (а в дальнейшем диаграммой иерархии классов) в стиле языка UML, если для заголовочного файла MyCls.h вызовете контекстное меню и в нем приведете в исполнение команду View Class Diagram (рис. 2.7).
Рис. 2.7. Диаграмма класса CMyCls
Для настройки интерфейса консольного приложения и получения текущей даты можно воспользоваться следующим нехитрым кодом:
setlocale(LC_ALL,"rus"); system("color 1e"); system("cls"); system("date /T"); system("time /T"); system("ver"); cout<<endl; CTime theTime = CTime::GetCurrentTime(); cout<<"Текущая дата: "<<theTime.GetDay()<<'/'<<theTime.GetMonth()<<'/' <<theTime.GetYear()<<endl; char *DayNames[]={"Вс","Пн","Вт","Ср","Чт","Пт","Сб"}; cout<<"День недели:"<<DayNames[theTime.GetDayOfWeek()-1]<<endl<<endl;
|
Шаг 5. Разработка собственного класса. Наконец-то вы можете заняться реализацией собственного класса в соответствии с вашим счастливым случаем. Желаю чтобы удача повернулась к вам приличной частью тела.
