Ö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 dosya halinde düzenleyeceksiniz:
Shape.h: Tüm şekiller için taslak 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ı (protected) bir
std::string nameüyesi - İsmi başlatan bir yapıcı (constructor)
doubledöndüren saf sanal (pure virtual)area()veperimeter()metotları- Şeklin ismini döndüren bir
getName()metodu - Sanal bir yıkıcı (virtual destructor)
- Şekli tanımlamak için korumalı (protected) bir
Circle.h:Shapesınıfından miras alan birCirclesınıfı uygulayın:- Özel (private) bir
double radiusüyesi - Yarıçapı alan bir yapıcı (ismi
"Circle"olarak ayarlayın) - Şu formülü kullanarak
area()metodunu uygulayın: 3.14159 * radius * radius - Şunu kullanarak
perimeter()metodunu uygulayın: 2 * 3.14159 * radius
- Özel (private) bir
Rectangle.h:Shapesınıfından miras alan birRectanglesınıfı uygulayın:- Özel (private)
double widthvedouble heightüyeleri - Genişlik ve yüksekliği alan bir yapıcı (ismi
"Rectangle"olarak ayarlayın) area()metodunu width * height olarak uygulayınperimeter()metodunu 2 * (width + height) olarak uygulayın
- Özel (private)
main.cpp: Dört girişi okuyun (her biri ayrı bir satırda):- Daire yarıçapı (double)
- Dikdörtgen genişliği (double)
- Dikdörtgen yüksekliği (double)
- İkinci daire yarıçapı (double)
Her üç şekli de dinamik olarak oluşturun ve bunları bir
Shape*işaretçi dizisinde saklayın. Dizide döngü kurun ve her şekil için bilgilerini şu formatta yazdırın:<name>: Area: <area> Perimeter: <perimeter>Her şekil arasına boş bir satır yazdırın. İşiniz bittiğinde dinamik olarak ayrılmış nesnelerinizi temizleyin.
Örneğin, 5, 4, 6 ve 3 girişleri ile:
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ü için nasıl çalıştığına dikkat edin — polimorfizmin gücü budur. Kodunuz, daireleri ve dikdörtgenleri Shape arayüzü üzerinden aynı şekilde işler ve her şekil kendi ölçümlerini nasıl hesaplayacağını bilir. Doğru fonksiyon imzalarını sağlamak için geçersiz kılınan tüm metotlarda override anahtar kelimesini 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şturun
// Shape* shapes[3];
// TODO: Şekilleri dinamik olarak oluşturun ve dizide saklayın
// shapes[0] = new Circle(...);
// shapes[1] = new Rectangle(...);
// shapes[2] = new Circle(...);
// TODO: Dizi boyunca döngü kurun ve her şeklin bilgisini yazdırın
// Format:
// <name>:
// Area: <area>
// Perimeter: <perimeter>
// (şekiller arasında boş satır, ancak sonuncusundan sonra değil)
// TODO: Dinamik olarak ayrılmış nesneleri temizleyin
// 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 Konteyner