Создание класса управления ракетой.

 

Определим класс CRoket.

class CRocket{}; Опишем в нем закрытые атрибуты, описывающие состояние ракеты. Поскольку атрибуты должны быть закрытыми, то используем для их записи ключевое слово private. Кроме того, в закрытой части класса опишем внутреннюю переменную, хранящую текущее время полета ракеты. А для вычисления текущего местоположения ракеты в каждый момент времени определим закрытую функцию вычисления этих координат ComputeRockCoords.class CRocket{ private: // состояние ракеты bool m_state; // начальное угловое положение ракеты double m_H0,m_P0; // курс и тангаж // текущие координаты в пространстве double m_X,m_Y,m_Z; // скорость ракеты double m_speed; // текущее время полета ракеты double m_t; // функция вычисления тек. координат void ComputeRockCoords(void);};Заметим, что атрибуты (по-другому называемые еще членами класса) записываем с префиксом «m_». Это одно из негласных правил программистов. Данный префикс сигнализирует программисту, что данная переменная принадлежит классу (от английского слова «member»).

Далее добавим описание интерфейса класса. Интерфейс представляет собой открытые функции-члены класса, к которым будет обращаться основная программа при работе с объектами создаваемого класса. Поскольку интерфейс должен быть открытым для внешнего доступа, то все его элементы (прототипы функций (!)) должны быть описаны с ключевым словом public. Кроме того, по негласному правилу программистов (чуть выше мы говорили об этом), поскольку данная часть класса будет открытой, то в описании класса она должна следовать в самом начале описания класса. Кроме того, определим конструктор класса, в задачу которого будет входить инициализация объекта описываемого класса, а также деструктор.

class CRocket{ public: // конструктор класса CRocket(void); // деструктор класса ~CRocket(void); //функция возврата текущего состояния bool GetState(void); //ф-ия возврата тек. координат ракеты void GetPosition(double *x, double *y, double *z, double *h, double *p); //ф-ия старта ракеты void LaunchRocket(double h0, double p0, double speed); //ф-ия подрыва ракеты void ExplodeRocket(void); private: // состояние ракеты bool m_state; // начальное угловое положение ракеты double m_H0,m_P0; // текущие координаты в пространстве double m_X,m_Y,m_Z; // скорость ракеты double m_speed; // текущее время полета ракеты double m_t; // функция вычисления тек. координат void ComputeRockCoords(void);};

Итак, именно так будет выглядеть описание класса, который нам требуется разработать. Поместим его в специально созданный файл с именем Roket.h.

Теперь приступим к реализации функций, являющихся интерфейсом данного класса. Все функции поместим в специально созданный файл с именем Roket.cpp.Чтобы показать, что реализуемые нами функции принадлежат именно классу CRocket, перед именем каждой функции нужно указывать префикс «CRocket::».

// конструктор классаCRocket::CRocket(){ // состояние ракеты m_state=false; }

 

// деструктор классаCRocket::~CRocket(void){};

 

//функция возврата текущего состоянияbool CRocket::GetState(void){ return m_state;} //ф-ия возврата тек. координат ракетыvoid CRocket::GetPosition(double *x, double *y, double *z, double *h, double *p){ // вычислить координаты ракеты ComputeRockCoords(); *x=m_X; *y=m_Y; *z=m_Z; *h=m_H0*180.0/3.1416; *p=m_P0*180.0/3.1416;} //ф-ия старта ракеты void CRocket::LaunchRocket(double h0, double p0, double speed){ // текущее время полета ракеты double m_t=0.0; // стартовые параметры ракеты m_X=0.0; m_Y=0.0; m_Z=0.0; m_H0=h0*3.1416/180.0; m_P0=p0*3.1416/180.0; m_speed=speed; // ракета полетела m_state=true; printf(”\nRoket’ve started.”);} //ф-ия подрыва ракетыvoid CRocket::ExplodeRocket(void){ // ракета взорвана m_state=false; printf(”Roket exploded.\n”);}

Теперь реализуем закрытые функции класса. Опять же, чтобы показать, что эти реализуемые функции принадлежат именно классу CRocket, перед именем функции нужно указывать префикс «CRocket::». Таких закрытых функций у нас всего одна – функция вычисления текущего положения ракеты в каждый момент времени.

// функция вычисления тек. координатvoid CRocket::ComputeRockCoords(void){ if(m_state) // если ракета летит { // дискретное время полета double dt=0.1; // новые координаты за время dt m_X+=m_speed*cos(m_P0)*sin(m_H0)*dt; m_Y+=m_speed*cos(m_P0)*cos(m_H0)*dt; m_Z+=m_speed*sin(m_P0)*dt; }}

Теперь напишем главную часть программы с функцией main, в которой будет происходить управление объектами класса CRocket. Добавим для упрощения к коду программы функцию управления RocketControl, отвечающую за запуск и подрыв ракеты.

 

#include <stdafx.h>

#include <stdio.h>

#include <stdlib.h>

#include “Roсket.h”