Menu
Coddy logo textTech

Projeye Genel Bakış

Coddy'nin C Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 44 / 61.

challenge icon

Görev

Kolay

Shape 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. Öncelikle Shape struct'ı 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ürmez
    • AreaFunc: const Shape* parametresi alır ve bir double döndürür
    Son olarak, iki işlev işaretçisi içeren Shape struct'ının kendisini tanımla: draw (DrawFunc türünde) ve area (AreaFunc tü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 shape yazdırır
    • test_area: 42.0 döndürür
    Bir 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

Kendi başına pratik yap: Online C derleyicisi