Итоги: Калькулятор фигур
Часть раздела Объектно-ориентированное программирование путешествия по C++ на Coddy. Урок 63 из 104.
Задание
ЛегкоДавайте создадим калькулятор фигур, который объединит всё, что вы узнали о полиморфизме. Вы создадите абстрактный класс Shape и реализуете конкретные фигуры, вычисляющие их area и perimeter, доступные через общий интерфейс.
Вы организуете код в четырёх файлах:
Shape.h: Определите абстрактный классShape, который служит шаблоном для всех фигур. Ваш базовый класс должен содержать:- защищённый член
std::string nameдля идентификации фигуры - constructor, который инициализирует имя
- pure virtual методы
area()иperimeter(), возвращающиеdouble - метод
getName(), возвращающий имя фигуры - виртуальный destructor
- защищённый член
Circle.h: Реализуйте классCircle, наследующий отShape:- закрытый член
double radius - constructor, принимающий радиус (установите имя в
"Circle") - Реализуйте
area()с использованием formula: 3.14159 * radius * radius - Реализуйте
perimeter()с использованием: 2 * 3.14159 * radius
- закрытый член
Rectangle.h: Реализуйте классRectangle, наследующий отShape:- закрытые члены
double widthиdouble height - constructor, принимающий width и height (установите имя в
"Rectangle") - Реализуйте
area()как width * height - Реализуйте
perimeter()как 2 * (width + height)
- закрытые члены
main.cpp: Read четыре inputs (каждый в отдельной строке):- Радиус Circle (double)
- width Rectangle (double)
- height Rectangle (double)
- Радиус второй Circle (double)
Create все три фигуры dynamically и сохраните их в array указателей
Shape*. Выполните Loop по array и для each фигуры print её информацию в следующем формате:<name>: Area: <area> Perimeter: <perimeter>Print blank line between каждой фигурой. Выполните Clean динамически allocated objects после завершения работы.
Например, при inputs 5, 4, 6 и 3:
Circle:
Area: 78.5397
Perimeter: 31.4159
Rectangle:
Area: 24
Perimeter: 20
Circle:
Area: 28.2743
Perimeter: 18.8495Обратите внимание, как одна и та же логика printShapeInfo работает с любым типом фигуры. В этом заключается сила полиморфизма. Ваш код обрабатывает Circle и Rectangle одинаково через интерфейс Shape, а each фигура знает, как вычислять собственные измерения. Используйте ключевое слово override во всех переопределённых методах, чтобы обеспечить корректные сигнатуры функций.
Попробуйте сами
#include <iostream>
#include "Shape.h"
#include "Circle.h"
#include "Rectangle.h"
using namespace std;
int main() {
// Считать входные данные
double circleRadius1, rectWidth, rectHeight, circleRadius2;
cin >> circleRadius1;
cin >> rectWidth;
cin >> rectHeight;
cin >> circleRadius2;
// TODO: Создать массив указателей Shape* с 3 элементами
// Shape* shapes[3];
// TODO: Создать фигуры динамически и сохранить в массив
// shapes[0] = new Circle(...);
// shapes[1] = new Rectangle(...);
// shapes[2] = new Circle(...);
// TODO: Пройти по массиву и вывести информацию о каждой фигуре
// Формат:
// <name>:
// Area: <area>
// Perimeter: <perimeter>
// (пустая строка между фигурами, но не после последней)
// TODO: Очистить динамически выделенные объекты
// delete shapes[i];
return 0;
}
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыСборка и компиляция C++Заголовочные файлы и файлы исходного кодаПространства имен и область видимостиВведение в ООП на C++Классы и объектыУказатель 'this'Методы (функции-члены)Атрибуты (члены данных)Основы конструкторов и деструкторовИтоги — Простой калькулятор4Свойства классов
Члены экземпляра против статическихГеттеры и сеттерыКонстантные функции-членыКлючевое слово mutableСтатические методы и переменныеДружественные функции и классыИтоги — Менеджер банковских счетов7Наследование
Основы наследованияУровни доступа при наследованииПорядок вызова конструкторов и деструкторовПереопределение методовВиртуальные функции и VTableМножественное наследованиеВиртуальное наследованиеИтоги — Иерархия сотрудников10Обзор STL
Обзор и философия STLКонтейнеры STLИтераторыАлгоритмы STLФункторы и лямбда-выраженияИтоги: частота слов13Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonFactory и Abstract FactoryПаттерн BuilderПаттерн ObserverПаттерн Strategy2Управление памятью
Стек и кучаУказатели и ссылкиДинамическая память (new/delete)Умные указатели в C++RAII в C++Итоги — Менеджер динамического массива5Инкапсуляция
Спецификаторы доступа в C++Спецификаторы доступа: подробный разборСокрытие данныхStruct против ClassВложенные и внутренние классыИтоги — Система учета студентов8Полиморфизм
Полиморфизм компиляции и времени выполненияПерегрузка функцийВиртуальные функции: повторениеЧистые виртуальные функцииАбстрактные классыПроектирование интерфейсов на C++Dynamic Casting и RTTIИтоги: Калькулятор фигур11Продвинутые концепции ООП
Композиция против наследованияМиксины через CRTPИдиома PimplСтирание типовEnum Classes и строгая типизацияОбработка исключений в ООППользовательские иерархии исключений14Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикRAII как паттерн3Конструкторы и деструкторы
Конструктор по умолчаниюПараметризованный конструкторКонструктор копированияКонструктор перемещенияСписки инициализации конструктораДелегирующие конструкторыГлубокое погружение в деструкторыПравило трех / пяти / нуляПовторение — класс String6Перегрузка операторов
Введение в перегрузку операторовПерегрузка арифметических операторовПерегрузка операторов сравненияОператоры потоковПерегрузка оператора присваиванияПерегрузка операторов [] и ()Операторы преобразования типовИтоги — класс Matrix9Шаблоны
Шаблоны функцийШаблоны классовСпециализация шаблоновВариативные шаблоныОсновы SFINAE и Type TraitsИтоги — Обобщенный контейнерПотренируйтесь самостоятельно: Онлайн-компилятор C++