Panoramica del progetto
Fa parte della sezione Programmazione orientata agli oggetti del percorso C di Coddy. Lezione 44 di 61.
Sfida
FacileGettiamo 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 strutturaShape. Poi definisci due tipi di puntatore a funzione:DrawFunc: accetta un parametroconst Shape*e non restituisce nullaAreaFunc: accetta un parametroconst Shape*e restituisce undouble
Shapestessa, che contiene due puntatori a funzione:draw(di tipoDrawFunc) earea(di tipoAreaFunc). 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: stampaDrawing test shapetest_area: restituisce42.0
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.0Perché 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
1Basi di programmazione modulare
File di intestazioneGuardie di inclusioneFile sorgenteFunzioni staticheRipasso: calcolatrice modulare4Incapsulamento
Il concetto di puntatori opachiDefinire struct opacheGetter e setterLa convalida nei setterRiepilogo: scatola segreta2Oggetti e metodi
Le struct come oggettiIl puntatore 'Self'Correttezza constPuntatore o valoreMetodi di supportoRiepilogo: gestore di punti5Progetto: Conto bancario semplice
Configurazione del progettoImplementazione del conto8Polimorfismo
Puntatori a funzione nelle structSimulare i metodiIl concetto di interfacciaImplementare le interfacceIterazione polimorficaRiepilogo: Greeter11Pattern di progettazione in C
Pattern SingletonPattern FactoryPattern IteratorRiepilogo: Factory di Logger3Ciclo di vita degli oggetti
Pattern del costruttorePattern del distruttoreInizializzazione sullo stackCopia profondaRiepilogo: wrapper di stringhe6Ereditarietà tramite composizione
Incorporamento delle structLa regola del primo membroAccesso ai membri della classe baseUpcastingRiepilogo: gerarchia di forme9Progetto: Disegnatore di forme
Panoramica del progettoImplementazione del cerchioImplementazione del rettangoloUtilizzo polimorficoContenitore di formeEsercitati da solo: Compilatore C online