Драгоценные методические указания



Шаг 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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!