Podsumowanie — kalkulator kształtów
Część sekcji Programowanie obiektowe ścieżki C++ w Coddy. Lekcja 63 z 104.
Wyzwanie
ŁatwyStwórzmy kalkulator kształtów, który łączy wszystko, czego nauczyłeś się o polimorfizmie. Utworzysz abstrakcyjną klasę Shape i zaimplementujesz konkretne kształty, które obliczają swoje pole i obwód, a wszystko będzie dostępne za pośrednictwem wspólnego interfejsu.
Rozmieścisz kod w czterech plikach:
Shape.h: Zdefiniuj abstrakcyjną klasęShape, która będzie wzorcem dla wszystkich kształtów. Twoja klasa bazowa powinna zawierać:- Chroniony element składowy
std::string namesłużący do identyfikowania kształtu - Konstruktor inicjalizujący nazwę
- Czysto wirtualne metody
area()iperimeter(), które zwracają wartość typudouble - Metodę
getName(), która zwraca nazwę kształtu - Wirtualny destruktor
- Chroniony element składowy
Circle.h: Zaimplementuj klasęCircledziedziczącą poShape:- Prywatny element składowy
double radius - Konstruktor przyjmujący promień (ustawiający nazwę na
"Circle") - Zaimplementuj
area()przy użyciu wzoru: 3.14159 * radius * radius - Zaimplementuj
perimeter()przy użyciu wzoru: 2 * 3.14159 * radius
- Prywatny element składowy
Rectangle.h: Zaimplementuj klasęRectangledziedziczącą poShape:- Prywatne elementy składowe
double widthidouble height - Konstruktor przyjmujący szerokość i wysokość (ustawiający nazwę na
"Rectangle") - Zaimplementuj
area()jako width * height - Zaimplementuj
perimeter()jako 2 * (width + height)
- Prywatne elementy składowe
main.cpp: Wczytaj cztery wartości (każdą w osobnym wierszu):- Promień okręgu (double)
- Szerokość prostokąta (double)
- Wysokość prostokąta (double)
- Promień drugiego okręgu (double)
Utwórz dynamicznie wszystkie trzy kształty i przechowaj je w tablicy wskaźników typu
Shape*. Przejdź pętlą przez tablicę i dla każdego kształtu wypisz jego informacje w następującym formacie:<name>: Area: <area> Perimeter: <perimeter>Wypisz pusty wiersz między każdym kształtem. Po zakończeniu zwolnij dynamicznie przydzielone obiekty.
Na przykład dla danych wejściowych 5, 4, 6 i 3:
Circle:
Area: 78.5397
Perimeter: 31.4159
Rectangle:
Area: 24
Perimeter: 20
Circle:
Area: 28.2743
Perimeter: 18.8495Zauważ, że ta sama logika printShapeInfo działa dla dowolnego typu kształtu. Na tym polega siła polimorfizmu. Twój kod przetwarza okręgi i prostokąty w identyczny sposób za pośrednictwem interfejsu Shape, a każdy kształt sam potrafi obliczyć swoje wymiary. Użyj słowa kluczowego override dla wszystkich nadpisanych metod, aby zapewnić zgodność sygnatur funkcji.
Spróbuj swoich sił
#include <iostream>
#include "Shape.h"
#include "Circle.h"
#include "Rectangle.h"
using namespace std;
int main() {
// Wczytaj dane wejściowe
double circleRadius1, rectWidth, rectHeight, circleRadius2;
cin >> circleRadius1;
cin >> rectWidth;
cin >> rectHeight;
cin >> circleRadius2;
// TODO: Utwórz tablicę 3 wskaźników Shape*
// Shape* shapes[3];
// TODO: Utwórz obiekty figur dynamicznie i umieść je w tablicy
// shapes[0] = new Circle(...);
// shapes[1] = new Rectangle(...);
// shapes[2] = new Circle(...);
// TODO: Przejdź przez tablicę i wypisz informacje o każdej figurze
// Format:
// <name>:
// Pole: <area>
// Obwód: <perimeter>
// (pusta linia między figurami, ale nie po ostatniej)
// TODO: Zwolnij pamięć zajmowaną przez dynamicznie utworzone obiekty
// delete shapes[i];
return 0;
}
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneBudowanie i kompilacja C++Pliki nagłówkowe i pliki źródłowePrzestrzenie nazw i zakresWprowadzenie do programowania obiektowego w C++Klasy a obiektyWskaźnik „this”Metody (funkcje składowe)Atrybuty (składowe danych)Podstawy konstruktorów i destruktorówPowtórzenie – prosty kalkulator4Właściwości klas
Elementy instancji a elementy statyczneGettery i setteryStałe funkcje składoweSłowo kluczowe mutableMetody i zmienne statyczneFunkcje i klasy zaprzyjaźnionePodsumowanie – menedżer konta bankowego7Dziedziczenie
Podstawy dziedziczeniaPoziomy dostępu w dziedziczeniuKolejność wywołań konstruktora i destruktoraNadpisywanie metodFunkcje wirtualne i VTableWielokrotne dziedziczenieDziedziczenie wirtualnePowtórzenie — hierarchia pracowników2Zarządzanie pamięcią
Pamięć stosu a stertyWskaźniki i referencjePamięć dynamiczna (new/delete)Inteligentne wskaźniki w C++RAII w C++Podsumowanie — menedżer tablicy dynamicznej5Hermetyzacja
Specyfikatory dostępu w C++Specyfikatory dostępu — szczegółowoUkrywanie informacjiStruktura a klasaKlasy zagnieżdżone i wewnętrznePodsumowanie — system ewidencji studentów8Polimorfizm
Polimorfizm czasu kompilacji i wykonaniaPrzeciążanie funkcjiFunkcje wirtualne — powtórkaCzysto wirtualne funkcjeKlasy abstrakcyjneProjektowanie interfejsów w C++Rzutowanie dynamiczne i RTTIPodsumowanie — kalkulator kształtów3Konstruktory i destruktory
Konstruktor domyślnyKonstruktor z parametramiKonstruktor kopiującyKonstruktor przenoszącyListy inicjalizacyjne konstruktoraKonstruktory delegująceDestruktor — szczegółowe omówienieZasada trzech / pięciu / zeraPodsumowanie — klasa String6Przeciążanie operatorów
Wprowadzenie do przeciążania operatorówPrzeciążanie operatorów arytmetycznychPrzeciążanie operatorów porównaniaOperatory strumieniowePrzeciążanie operatora przypisaniaPrzeciążanie operatorów [] i ()Operatory konwersji typówPodsumowanie — klasa Matrix9Szablony
Szablony funkcjiSzablony klasSpecjalizacja szablonówSzablony wariadycznePodstawy SFINAE i cech typówPodsumowanie — kontener generycznyPoćwicz samodzielnie: Kompilator C++ online