Menu
Coddy logo textTech

Panoramica del progetto

Fa parte della sezione Programmazione orientata agli oggetti del percorso C di Coddy. Lezione 44 di 61.

challenge icon

Sfida

Facile

Gettiamo le basi del progetto Shape Drawer creando la struttura base Shape: un'interfaccia che definisce cosa può fare qualsiasi forma tramite puntatori a funzione.

Creerai due file per configurare questo sistema polimorfico:

  • shape.h: definisci qui l'interfaccia principale. Per prima cosa, crea una dichiarazione anticipata della struttura Shape. Poi definisci due tipi di puntatore a funzione:
    • DrawFunc: accetta un parametro const Shape* e non restituisce nulla
    • AreaFunc: accetta un parametro const Shape* e restituisce un double
    Infine, definisci la struttura Shape stessa, che contiene due puntatori a funzione: draw (di tipo DrawFunc) e area (di tipo AreaFunc). Questa struttura funge esclusivamente da interfaccia. Non contiene dati specifici della forma, ma solo comportamenti.
  • main.c: dimostra che l'interfaccia funziona creando una semplice forma di test. Implementa due funzioni:
    • test_draw: stampa Drawing test shape
    • test_area: restituisce 42.0
    Crea un'istanza di Shape, collegala a queste funzioni di test, quindi chiama entrambe tramite l'interfaccia. Stampa il risultato dell'area con una cifra decimale.

Il tuo output dovrebbe dimostrare che i puntatori a funzione funzionano correttamente:

Drawing test shape
Area: 42.0

Perché la dichiarazione anticipata? Potresti chiederti perché typedef struct Shape Shape; compare prima che la struttura sia definita completamente. È necessario perché DrawFunc e AreaFunc fanno riferimento a const Shape* nei tipi dei loro parametri, ma a quel punto del file il compilatore non ha ancora visto la definizione completa della struttura. La dichiarazione anticipata dice al compilatore: "esiste una struttura chiamata Shape", e questo basta per usare un puntatore a essa. La definizione completa viene dopo. Questo schema è comune in C ogni volta che una struttura deve fare riferimento a sé stessa (direttamente o tramite puntatori a funzione).

L'intuizione fondamentale è che Shape non sa nulla di cerchi o rettangoli. Sa solo che qualsiasi forma deve poter draw se stessa e calcolare la propria area. Nelle prossime lezioni creerai forme concrete che incorporano questa struttura base e forniscono le proprie implementazioni. Ricordati di usare le guardie di inclusione nel tuo file header.

Provalo tu

#include <stdio.h>
#include "shape.h"

// TODO: Implementare la funzione test_draw
// - Accetta un parametro const Shape*
// - Stampa "Drawing test shape"
void test_draw(const Shape* shape) {
    // TODO: Stampare il messaggio richiesto
}

// TODO: Implementare la funzione test_area
// - Accetta un parametro const Shape*
// - Restituisce 42.0
double test_area(const Shape* shape) {
    // TODO: Restituire il valore dell'area di test
}

int main() {
    // TODO: Creare un'istanza di Shape
    
    // TODO: Collegare la forma alle funzioni test_draw e test_area
    
    // TODO: Chiamare draw tramite l'interfaccia
    
    // TODO: Chiamare area tramite l'interfaccia e stampare il risultato con una cifra decimale
    // Formato: "Area: %.1f\n"
    
    return 0;
}

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore C online