Projeye Genel Bakış
Coddy'nin C Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 44 / 61.
Görev
KolayShape Drawer projesinin temelini, herhangi bir şeklin işaretçi işlevler aracılığıyla neler yapabileceğini tanımlayan bir arayüz olan temel Shape struct'ını oluşturarak atalım.
Bu polimorfik sistemi kurmak için iki dosya oluşturacaksın:
shape.h: Temel arayüzü burada tanımla. ÖncelikleShapestruct'ı için bir ileri bildirim oluştur. Ardından iki işlev işaretçisi türü tanımla:DrawFunc:const Shape*parametresi alır ve hiçbir şey döndürmezAreaFunc:const Shape*parametresi alır ve birdoubledöndürür
Shapestruct'ının kendisini tanımla:draw(DrawFunctüründe) vearea(AreaFunctüründe). Bu struct yalnızca bir arayüz görevi görür. Şekle özgü hiçbir veri içermez, yalnızca davranış içerir.main.c: Basit bir test şekli oluşturarak arayüzünün çalıştığını göster. İki işlev uygula:test_draw:Drawing test shapeyazdırırtest_area:42.0döndürür
Shapeörneği oluştur, bunu bu test işlevlerine bağla, ardından arayüz üzerinden her ikisini de çağır. Alan sonucunu virgülden sonra bir basamak olacak şekilde yazdır.
Çıktın, işlev işaretçilerinin doğru şekilde çalıştığını göstermelidir:
Drawing test shape
Area: 42.0İleri bildirim neden gerekli? typedef struct Shape Shape; ifadesinin struct tamamen tanımlanmadan önce neden göründüğünü merak edebilirsin. Bunun nedeni, DrawFunc ve AreaFunc'un parametre türlerinde const Shape* kullanmasıdır; ancak dosyanın bu noktasında derleyici henüz struct'ın tam tanımını görmemiştir. İleri bildirim derleyiciye "Shape adında bir struct var" bilgisini verir ve bu da struct'a yönelik bir işaretçi kullanmak için yeterlidir. Tam tanım daha sonra gelir. Bu kalıp, bir struct'ın doğrudan veya işlev işaretçileri aracılığıyla kendisine başvurması gerektiğinde C dilinde yaygın olarak kullanılır.
Buradaki temel fikir, Shape'ın daireler veya dikdörtgenler hakkında hiçbir şey bilmemesidir. Yalnızca herhangi bir şeklin kendisini draw edebilmesi ve area değerini hesaplayabilmesi gerektiğini bilir. Gelecek derslerde, bu temel struct'ı içeren ve kendi uygulamalarını sağlayan somut şekiller oluşturacaksın. Başlık dosyanda include guard kullanmayı unutma.
Kendin dene
#include <stdio.h>
#include "shape.h"
// TODO: test_draw fonksiyonunu uygula
// - const Shape* parametresi alır
// - Prints "Drawing test shape"
void test_draw(const Shape* shape) {
// TODO: Gerekli mesajı yazdır
}
// TODO: test_area fonksiyonunu uygula
// - const Shape* parametresi alır
// - 42.0 döndürür
double test_area(const Shape* shape) {
// TODO: Test alan değerini döndür
}
int main() {
// TODO: Bir Shape örneği oluştur
// TODO: shape'i test_draw ve test_area fonksiyonlarına bağla
// TODO: Arayüz üzerinden draw'ı çağır
// TODO: Arayüz üzerinden area'yı çağır ve bir ondalık basamakla yazdır
// Biçim: "Area: %.1f\n"
return 0;
}
Nesne Yönelimli Programlama bölümündeki tüm dersler
1Modüler Programlama Temelleri
Başlık DosyalarıInclude Guard'larKaynak DosyalarıStatik FonksiyonlarÖzet: Modüler Hesap Makinesi4Kapsülleme
Opaque Pointer KavramıOpaque Struct TanımlamaGetter ve Setter MetotlarıSetter Metotlarında DoğrulamaÖzet: Gizli Kutu2Nesneler ve Metotlar
Nesne Olarak Struct'lar'Self' İşaretçisiConst Doğruluğuİşaretçi vs DeğerYardımcı MetotlarÖzet: Point Manager5Proje: Basit Banka Hesabı
Proje KurulumuHesabın Oluşturulması3Nesne Yaşam Döngüsü
Constructor DeseniDestructor DeseniStack İlklendirmeDerin KopyalamaÖzet: String Wrapper6Kompozisyon Yoluyla Kalıtım
Struct Gömmeİlk Üye KuralıÜst Üyelere ErişimUpcastingÖzet: Şekil Hiyerarşisi9Proje: Şekil Çizici
Projeye Genel BakışDaire UygulamasıDikdörtgen UygulamasıPolimorfik KullanımŞekil KapsayıcısıKendi başına pratik yap: Online C derleyicisi