Драгоценные методические указания
Шаг 1. Создание каркаса консольного приложения. Создайте консольное приложение с поддержкой MFC. В данном сценарии предполагается, что вы нарекли проект именем SmpCL. но вы вправе выбрать любое другое.
Шаг 2. Добавление в проект заготовки собственного класса. Выберите для своего класса имя в соответствии с его функциональностью, т.е. с вашим вариантом задания. Рекомендуется имя класса начинать с буквы С. Предположим, что вы назвали класс CMyCls. Выполните команду ProjectàAdd 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. Добавление в класс член-данных и член-функций. Это действо можно выполнить как «вручную», так и с помощью мастера ИС. Рассмотрим последний случай.
Выполните команду ViewàClass 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. Разработка собственного класса. Наконец-то вы можете заняться реализацией собственного класса в соответствии с вашим счастливым случаем. Желаю чтобы удача повернулась к вам приличной частью тела.
Класс вектор
Приходит студент-программист на занятия с утра злой. Однокурсники его спрашивают:
- Ты чего такой злой?
- Да программу вчера всю ночь набивал.
- И что, не заработала?
- Да нет, заработала.
- Может, неправильно заработала?
- Да нет, правильно.
- А что тогда?
- Да на Backspace уснул…
Автор не известен, но можно ему посочувствовать
Цель работы – разработать собственный (конечно же, гениальный!) класс, предназначенный для обработки массивов чисел (4 час.)
Задание. Требуется разработать свой собственный класс, облегчающий работу с числовыми массивами. Класс должен иметь, помимо конструктора (ов) и деструктора, перечисленные в табл. 1 методы.
Таблица 1
Методы класса
Метод | Назначение |
Size | Возвращает фактическое число элементов массива |
Capacity | Возвращает число элементов массива, для которых зарезервирована память |
SetCapacity | Позволяет задать число элементов массива, для которых должна быть зарезервирована память |
SetElem | Задать значение элемента массива с заданным индексом |
GetElem | Получить значение элемента массива с заданным индексом |
InsertElem | Вставить в заданную позицию новый элемент массива |
DeleteElem | Удалить элемент массива с заданным индексом |
AddElem | Добавить новый элемент в конец массива |
Методы для самостоятельной разработки | |
InsertVec | Вставить в заданную позицию данного массива другой массив |
DeleteVec | Удалить заданное число элементов массива, начиная с элемента с заданным индексом |
AddVec | Добавить новый массив в конец данного массива |
SortVec | Отсортировать массив в заданном порядке (по возрастанию или убыванию) |
Класс должен быть реализован таким образом, чтобы тип его элементов можно было изменить или задать наиболее безболезненным способом. Методы класса должны быть оптимизированы по времени. Это, в частности, значит, что вставка или удаление нескольких элементов массива (методы InsertVec() и DeleteVec()) не должна быть сведена к многократному вызову методов вставки и удаления одного элемента массива.
В работе также требуется реализовать программу – главную функцию, которая позволит тестировать методы класса. Уделите коду тестирования должное внимание, чтобы можно было как можно более легко и просто реализовать как корректные операции по использованию класса вектор, так и ошибочные.
Методические указания. При реализации класса можно воспользоваться примером класса TVector, приведенном в конспекте лекций и ниже.
Для отслеживания вызовов конструкторов и деструкторов класса рекомендуется поместить в них макросы TRACE, которые будут выводить в окно Debug соответствующие сообщения. Можно, естественно, поместить эти макросы и в другие функции класса.
Пример класса TVector
Этот пример реализован в проекте Vector (консольное приложение с поддержкой MFC). Содержимое заголовочного файла TVector.h (директивы препроцессора и компилятора опущены):
Содержимое файла реализации TVector.cpp (директивы препроцессора и компилятора опущены):
Тестирование класса:
Дата добавления: 2018-02-18; просмотров: 514; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!