Özet - Şekil Hesaplayıcı
Coddy'nin C++ Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 63 / 104.
Görev
KolayPolimorfizm hakkında öğrendiğiniz her şeyi bir araya getiren bir şekil hesaplayıcı oluşturalım. Soyut bir Shape sınıfı oluşturacak ve alanlarını ve çevrelerini hesaplayan somut şekiller uygulayacaksınız; bunların tümüne ortak bir arayüz üzerinden erişilebilecek.
Kodunuzu dört dosyaya ayıracaksınız:
Shape.h: Tüm şekiller için şablon görevi gören soyut birShapesınıfı tanımlayın. Temel sınıfınız şunlara sahip olmalıdır:- Şekli tanımlamak için korumalı bir
std::string nameüyesi - name değerini başlatan bir kurucu
area()döndüren saf sanalperimeter()vedoublemetotları- Şeklin name değerini döndüren bir
getName()metodu - Sanal bir yıkıcı
- Şekli tanımlamak için korumalı bir
Circle.h:Circlesınıfından miras alan birShapesınıfı uygulayın:- Özel bir
double radiusüyesi - Yarıçapı alan bir kurucu (name değerini
"Circle"olarak ayarlayın) area()metodunu şu formülü kullanarak uygulayın: 3.14159 * radius * radiusperimeter()metodunu şu formülü kullanarak uygulayın: 2 * 3.14159 * radius
- Özel bir
Rectangle.h:Rectanglesınıfından miras alan birShapesınıfı uygulayın:- Özel
double widthvedouble heightüyeleri - width ve height değerlerini alan bir kurucu (name değerini
"Rectangle"olarak ayarlayın) area()metodunu width * height olarak uygulayınperimeter()metodunu 2 * (width + height) olarak uygulayın
- Özel
main.cpp: Dört girdi okuyun (her biri ayrı bir satırda):- Circle yarıçapı (double)
- Rectangle genişliği (double)
- Rectangle yüksekliği (double)
- İkinci circle yarıçapı (double)
Üç şeklin tümünü dinamik olarak oluşturun ve bunları
Shape*işaretçilerinden oluşan bir dizide saklayın. Dizi üzerinde döngü kurun ve her şekil için bilgilerini şu biçimde yazdırın:<name>: Area: <area> Perimeter: <perimeter>Her şekil arasında boş bir satır yazdırın. İşiniz bittiğinde dinamik olarak ayrılan nesneleri temizleyin.
Örneğin, girdiler 5, 4, 6 ve 3 olduğunda:
Circle:
Area: 78.5397
Perimeter: 31.4159
Rectangle:
Area: 24
Perimeter: 20
Circle:
Area: 28.2743
Perimeter: 18.8495Aynı printShapeInfo mantığının herhangi bir şekil türüyle nasıl çalıştığına dikkat edin. Polimorfizmin gücü budur. Kodunuz, Shape arayüzü üzerinden circle ve rectangle nesnelerini aynı şekilde işler ve her şekil kendi ölçümlerini nasıl hesaplayacağını bilir. Doğru işlev imzalarını güvence altına almak için üzerine yazılan tüm metotlarda override anahtar sözcüğünü kullanın.
Kendin dene
#include <iostream>
#include "Shape.h"
#include "Circle.h"
#include "Rectangle.h"
using namespace std;
int main() {
// Girdileri oku
double circleRadius1, rectWidth, rectHeight, circleRadius2;
cin >> circleRadius1;
cin >> rectWidth;
cin >> rectHeight;
cin >> circleRadius2;
// TODO: 3 elemanlı bir Shape* işaretçi dizisi oluştur
// Shape* shapes[3];
// TODO: Şekilleri dinamik olarak oluştur ve diziye kaydet
// shapes[0] = new Circle(...);
// shapes[1] = new Rectangle(...);
// shapes[2] = new Circle(...);
// TODO: Diziyi döngüyle gez ve her şeklin bilgisini yazdır
// Biçim:
// <name>:
// Alan: <area>
// Çevre: <perimeter>
// (şekiller arasında boş satır, ama sonuncudan sonra değil)
// TODO: Dinamik olarak ayrılmış nesneleri temizle
// delete shapes[i];
return 0;
}
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarC++ Build ve DerlemeBaşlık Dosyaları ve Kaynak DosyalarıAd Alanları ve KapsamC++'ta OOP'ye GirişSınıflar ve Nesneler'this' İşaretçisiMetotlar (Üye Fonksiyonlar)Öznitelikler (Veri Üyeleri)Ctor ve Dtor TemelleriÖzet - Basit Hesap Makinesi4Sınıf Özellikleri
Örnek ve Statik ÜyelerGetter ve Setter MetotlarıConst Üye FonksiyonlarMutable Anahtar KelimesiStatik Metotlar ve DeğişkenlerFriend Fonksiyonlar ve SınıflarÖzet - Banka Hesabı Yöneticisi7Kalıtım
Temel KalıtımKalıtım Erişim SeviyeleriCtor ve Dtor Çağrılma SırasıMetot Geçersiz KılmaSanal Fonksiyonlar ve VTableÇoklu KalıtımSanal KalıtımÖzet - Çalışan Hiyerarşisi10STL Genel Bakış
STL Genel Bakış ve FelsefesiSTL KonteynerleriİteratörlerSTL AlgoritmalarıFunctor'lar ve Lambda İfadeleriÖzet - Kelime Frekansı13Tasarım Kalıpları 1. Bölüm
Tasarım Kalıplarına GirişSingleton KalıbıFactory ve Abstract FactoryBuilder KalıbıObserver KalıbıStrategy Kalıbı2Bellek Yönetimi
Stack ve Heap Bellekİşaretçiler ve ReferanslarDinamik Bellek (new/delete)C++'ta Akıllı İşaretçilerC++'ta RAIIÖzet - Dinamik Dizi Yöneticisi5Kapsülleme
C++'da Erişim BelirleyicilerDerinlemesine Erişim BelirleyicilerBilgi GizlemeStruct vs Classİç İçe ve Dahili SınıflarÖzet - Öğrenci Kayıt Sistemi8Çok Biçimlilik
Derleme ve Çalışma Zamanı Çok BiçimliliğiFonksiyon Aşırı YüklemeSanal Fonksiyonlara Yeniden BakışSaf Sanal FonksiyonlarSoyut SınıflarC++'ta Arayüz TasarımıDynamic Casting ve RTTIÖzet - Şekil Hesaplayıcı3Yapıcılar ve Yıkıcılar
Varsayılan YapıcıParametreli YapıcıKopya YapıcıTaşıma YapıcısıYapıcı İlklendirme ListeleriTemsilci YapıcılarYıkıcılara Derinlemesine BakışÜç / Beş / Sıfır KuralıÖzet - String Sınıfı6Operatör Aşırı Yükleme
Operatör Aşırı Yüklemeye GirişAritmetik Operatör Aşırı YüklemeKarşılaştırma Operatörü Aşırı YüklemeStream OperatörleriAtama Operatörü Aşırı Yükleme[] ve () Operatör Aşırı YüklemeTip Dönüşüm OperatörleriÖzet - Matris Sınıfı9Şablonlar
Fonksiyon ŞablonlarıSınıf ŞablonlarıŞablon ÖzelleştirmeVariadic ŞablonlarSFINAE ve Type Traits TemelleriÖzet - Generic KonteynerKendi başına pratik yap: Online C++ derleyicisi