Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Пример решения задания
Предметная область: «Летательные Аппараты» Пример реализации на языке C++: // // Летательные Аппараты (ЛА) //
#include < conio.h> #include < iostream.h> #include < string.h>
// Перечисление, которое задает возможные состояния // Летательного Аппарата - " на земле" и " в воздухе" enum Flying { onGround = 0, inAir };
// // Класс: Летательный Аппарат (или ЛА) // class FlyDevice { private: char name[100]; // Имя летательного аппарата
protected: Flying state; // Состояние
public: // Конструктор ЛА по умлочанию - без параметров FlyDevice(): state(onGround) { setName(" Неопознанный Летающий Объект"); cout < < " FlyDevice:: FlyDevice\t " < < getName() < < endl;
}
// Конструктор ЛА с параметром - именем ЛА FlyDevice(char *n) { state = onGround; setName(n); cout < < " FlyDevice:: FlyDevice\t " < < getName() < < endl; }
// Деструктор ЛА virtual ~FlyDevice() { cout < < " FlyDevice:: ~FlyDevice\t " < < getName() < < endl; }
// Два метода, которые осуществляют доступ к закрытой переменной name // Модификатор const говорит о том что переменная не должна изменяться virtual void setName(const char *n) { strcpy(name, n); } virtual char* getName() { return name; }
// Виртуальный метод - " летать" мозжет быть перекрыт в классах-потомках virtual void fly() { state = inAir; cout < < " FlyDevice:: fly\t\t " < < getName() < < " в воздухе! " < < endl; }; };
// // Класс: Планер - безмоторный ЛА. // Планер поднимается другим самолетом на определенную высоту // и далее парит в восходящих воздушных потоках // class Glider: public FlyDevice { protected: int windForce; // Сила ветра в баллах int startHeight; // Начальная высота
public: const static int STORM = 7; // Недопустимо сильный ветер const static int MIN_HEIGHT = 500; // Минимальная стартовая высота
// Конструктор Планера - инциализирует класс-родитель Glider(char* name): FlyDevice(name), startHeight(0), windForce(0) { cout < < " Glider:: Glider\t\t " < < getName() < < endl; }
// " Перекрываем" виртуальный метод класса-родителя virtual void fly();
// Методы доступа к переменным windForce и startHeight int getHeight() { return startHeight; } void setHeight(int h) { startHeight = h; }
int getWindForce() { return windForce; } void setWindForce(int wf) { windForce = wf; } };
// Пример описания тела метода вне описания класса void Glider:: fly() { if (getWindForce() < STORM & & getHeight() > = MIN_HEIGHT) { cout < < " Glider:: fly\t\t " < < getName() < < " Высота=" < < getHeight() < < " Сила Ветра=" < < getWindForce() < < endl; FlyDevice:: fly(); } else { cout < < " Glider:: fly\t\t " < < getName() < < " Нелетные условия полета" < < endl; } };
// Перечисление, которое задает возможные состояния // Двигателя - " остановлен", " запущен" enum EngineState { stopped = 0, started };
// // Класс: Самолет - моторный ЛА. // class Airplane: public FlyDevice { protected: int fuel; // Запас топлива EngineState engine; // Состояние двигателя
public: const static int MIN_FUEL = 100; // Минимальное количество горючего
// Конструктор класса - инциализирует класс-родитель Airplane(char* name): FlyDevice(name), engine(stopped), fuel(0) { cout < < " Airplane:: Airplane\t " < < getName() < < endl; }
// Деструктор класса - освобождаем ресурсы, очиащаем состояния ~Airplane() { if (state == inAir) { ground(); } if (engine == started) { cout < < " Airplane:: ~Airplane\t " < < getName() < < " Остановить двигатель" < < endl; engine = stopped; } else { cout < < " Airplane:: ~Airplane\t " < < getName() < < endl; } }
virtual void addFuel(int f) { fuel += f; cout < < " Airplane:: addFuel\t " < < getName() < < " Горючее=" < < fuel < < endl; }
// Объявление virtual для метода fly - лишнее, // так как метод уже объявлен виртуальным в классе-родителе. virtual void fly(); virtual void ground(); };
void Airplane:: fly() { if (fuel > MIN_FUEL) { if (engine! = started) { cout < < " Airplane:: fly\t\t " < < getName() < < " Запуск двигателя" < < endl; engine = started; } cout < < " Airplane:: fly\t\t " < < getName() < < " Горючее=" < < fuel < < endl;
// Вызвается метод класса-родителя FlyDevice:: fly();
// Горючее расходуется при полете fuel -= 50;
} else { cout < < " Airplane:: fly\t\t " < < getName() < < " Не хватает горючего! " < < endl; } }
// Новый метод Самолета - " Приземлиться" void Airplane:: ground() { cout < < " Airplane:: ground\t " < < getName() < < " Приземлиться" < < endl; state = onGround; }
void main() { clrscr();
{ // Скобки ограничивают область видимости переменных cout < < endl < < " *** Тест класса Glider ***" < < endl; Glider gl(" Scooter-FX12"); gl.setHeight(Glider:: MIN_HEIGHT + 100); gl.fly(); // Здесь будет вызван деструктор объекта gl }
{ // Скобки ограничивают область видимости переменных cout < < endl < < " *** Тест класса Airplane ***" < < endl; Airplane plane(" TY-134"); plane.fly();
plane.addFuel(Airplane:: MIN_FUEL + 300); plane.fly(); plane.fly(); plane.fly(); plane.ground(); // Здесь будет вызван деструктор объекта plane }
{ cout < < endl < < " *** Тест полиморфизма классов ***" < < endl; FlyDevice *a, *b;
// Динамическое создание объектов a = new Glider(" Glider-AQ23"); b = new Airplane(" LA-46");
a-> fly(); b-> fly();
cout < < " Имя объекта a = " < < a-> getName() < < endl; cout < < " Имя объекта b = " < < b-> getName() < < endl;
// При динамическом создании объектов // необходимо явно освобождать ресурсы delete a; // неявно вызывается деструктор Glider delete b; // неявно вызывается деструктор Airplane } } Результат выполнения программы: *** Тест класса Glider *** FlyDevice:: FlyDevice Scooter-FX12 Glider:: Glider Scooter-FX12 Glider:: fly Scooter-FX12 Высота=600 Сила Ветра=0 FlyDevice:: fly Scooter-FX12 в воздухе! FlyDevice:: ~FlyDevice Scooter-FX12
*** Тест класса Airplane *** FlyDevice:: FlyDevice TY-134 Airplane:: Airplane TY-134 Airplane:: fly TY-134 Не хватает горючего! Airplane:: addFuel TY-134 Горючее=400 Airplane:: fly TY-134 Запуск двигателя Airplane:: fly TY-134 Горючее=400 FlyDevice:: fly TY-134 в воздухе! Airplane:: fly TY-134 Горючее=350 FlyDevice:: fly TY-134 в воздухе! Airplane:: fly TY-134 Горючее=300 FlyDevice:: fly TY-134 в воздухе! Airplane:: ground TY-134 Приземлиться Airplane:: ~Airplane TY-134 Остановить двигатель FlyDevice:: ~FlyDevice TY-134
*** Тест полиморфизма классов *** FlyDevice:: FlyDevice Glider-AQ23 Glider:: Glider Glider-AQ23 FlyDevice:: FlyDevice LA-46 Airplane:: Airplane LA-46 Glider:: fly Glider-AQ23 Нелетные условия полета Airplane:: fly LA-46 Не хватает горючего! Имя объекта a = Glider-AQ23 Имя объекта b = LA-46 FlyDevice:: ~FlyDevice Glider-AQ23 Airplane:: ~Airplane LA-46 FlyDevice:: ~FlyDevice LA-46
|