Menu
Coddy logo textTech

Projeye Genel Bakış

Coddy'nin C Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 44 / 61.

challenge icon

Görev

Kolay

Herhangi 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, Shape yapısı için bir ön bildirim (forward declaration) oluşturun. Ardından iki fonksiyon göstericisi türü tanımlayın:
    • DrawFunc — bir const Shape* parametresi alır ve hiçbir şey döndürmez
    • AreaFunc — bir const Shape* parametresi alır ve bir double döndürür
    Son olarak, iki fonksiyon göstericisi içeren Shape yapısının kendisini tanımlayın: draw (DrawFunc türünde) ve area (AreaFunc tü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_drawDrawing test shape yazdırır
    • test_area42.0 değerini döndürür
    Bir 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.0

Neden ö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