Projeye Genel Bakış
Coddy'nin C Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 44 / 61.
Görev
KolayHerhangi bir şeklin neler yapabileceğini fonksiyon göstericileri (function pointers) aracılığıyla tanımlayan bir arayüz olan temel Shape yapısını oluşturarak Shape Drawer projesinin temelini atalım.
Bu polimorfik sistemi kurmak için iki dosya oluşturacaksınız:
shape.h: Çekirdek arayüzü burada tanımlayın. İlk olarak,Shapeyapısı için bir ön bildirim (forward declaration) oluşturun. Ardından iki fonksiyon göstericisi türü tanımlayın:DrawFunc— birconst Shape*parametresi alır ve hiçbir şey döndürmezAreaFunc— birconst Shape*parametresi alır ve birdoubledöndürür
Shapeyapısının kendisini tanımlayın:draw(DrawFunctüründe) vearea(AreaFunctüründe). Bu yapı tamamen bir arayüz görevi görür; şekle özgü veri tutmaz, sadece davranışları barındırır.main.c: Basit bir test şekli oluşturarak arayüzünüzün çalıştığını kanıtlayın. İki fonksiyon uygulayın:test_draw—Drawing test shapeyazdırırtest_area—42.0değerini döndürür
Shapeörneği oluşturun, bunu bu test fonksiyonlarına bağlayın ve ardından her ikisini de arayüz üzerinden çağırın. Alan sonucunu ondalık basamağı bir olacak şekilde yazdırın.
Çıktınız, fonksiyon göstericilerinin doğru çalıştığını göstermelidir:
Drawing test shape
Area: 42.0Neden ön bildirim? typedef struct Shape Shape; ifadesinin neden yapı tam olarak tanımlanmadan önce göründüğünü merak edebilirsiniz. Bu gereklidir çünkü DrawFunc ve AreaFunc, parametre türlerinde const Shape* ifadesine atıfta bulunur; ancak dosyanın o noktasında derleyici henüz yapının tam tanımını görmemiştir. Ön bildirim derleyiciye şunu söyler: "Shape adında bir yapı mevcuttur," bu da ona bir gösterici (pointer) kullanmak için yeterlidir. Tam tanım daha sonra gelir. Bu desen, C dilinde bir yapının kendisine (doğrudan veya fonksiyon göstericileri aracılığıyla) atıfta bulunması gerektiğinde yaygın olarak kullanılır.
Buradaki temel fikir, Shape yapısının daireler veya dikdörtgenler hakkında hiçbir şey bilmemesidir; sadece herhangi bir şeklin kendisini draw edebilmesi ve area hesaplayabilmesi gerektiğini bilir. Gelecek derslerde, bu temel yapıyı içine alan ve kendi uygulamalarını sunan somut şekiller oluşturacaksınız. Başlık dosyanızda include guard kullanmayı unutmayın.
Kendin dene
#include <stdio.h>
#include "shape.h"
// TODO: test_draw fonksiyonunu uygula
// - Bir const Shape* parametresi alır
// - "Drawing test shape" yazdırır
void test_draw(const Shape* shape) {
// TODO: Gerekli mesajı yazdır
}
// TODO: test_area fonksiyonunu uygula
// - Bir 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: Şekli test_draw ve test_area fonksiyonlarına bağla
// TODO: Arayüz üzerinden draw fonksiyonunu çağır
// TODO: Arayüz üzerinden area fonksiyonunu çağır ve bir ondalık basamakla yazdır
// Format: "Area: %.1f\n"
return 0;
}
Object Oriented Programming 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ı