Metodi di supporto
Fa parte della sezione Programmazione orientata agli oggetti del percorso C di Coddy. Lezione 10 di 61.
Finora abbiamo visto funzioni che modificano i dati delle struct (come player_take_damage) e funzioni che si limitano a visualizzarli. Ma c'è un'altra categoria importante: le funzioni che calcolano valori derivati dai membri delle struct senza modificare nulla.
Considera una struttura Rectangle che memorizza larghezza e altezza. L’area non viene memorizzata: viene calcolata al momento:
typedef struct {
double width;
double height;
} Rectangle;
double rectangle_area(const Rectangle *self) {
return self->width * self->height;
}
double rectangle_perimeter(const Rectangle *self) {
return 2 * (self->width + self->height);
}
Questi sono metodi ausiliari. Prendono i dati esistenti della struct e producono un nuovo valore. Nota che usano puntatori const poiché leggono soltanto, senza mai scrivere. Il risultato calcolato viene restituito anziché essere memorizzato nella struct.
Rectangle box = {5.0, 3.0};
printf("Area: %.1f\n", rectangle_area(&box)); // 15.0
printf("Perimeter: %.1f\n", rectangle_perimeter(&box)); // 16.0
Questo schema mantiene le tue struct essenziali: memorizza solo i dati indispensabili e calcola tutto il resto quando serve. Inoltre, garantisce che i valori derivati siano sempre coerenti con lo stato corrente.
Sfida
FacileCreiamo un modulo Circle che calcola valori derivati dai dati memorizzati. Ti eserciterai a scrivere metodi di supporto: funzioni che calcolano risultati dai membri di una struct senza modificarli.
Creerai tre file:
circle.h: dichiara una structCirclecon un solo membrodouble radius. Dichiara anche due metodi di supporto:circle_area: accetta un puntatoreconsta Circle e restituisce l'areacircle_circumference: accetta un puntatoreconsta Circle e restituisce la circonferenza
CIRCLE_H.circle.c: implementa entrambi i metodi di supporto. Per i calcoli, usa3.14159come valore di pi greco. La formula dell'area èpi * radius * radiuse quella della circonferenza è2 * pi * radius. Entrambe le funzioni devono solo leggere il raggio: non modificarlo mai.main.c: crea un Circle e usa i metodi di supporto per calcolarne e visualizzarne le proprietà.
Riceverai un input: il raggio del cerchio (come double).
Nel file principale, inizializza un Circle con il raggio fornito, poi usa i tuoi metodi di supporto per calcolare e stampare l'area e la circonferenza.
Stampa i risultati in questo formato:
Area: {area}
Circumference: {circumference}Usa %.2f per entrambi i valori, in modo da visualizzare due cifre decimali.
Ad esempio, con un raggio di 5.0, l'output sarebbe:
Area: 78.54
Circumference: 31.42Provalo tu
#include <stdio.h>
#include "circle.h"
int main() {
double radius;
scanf("%lf", &radius);
// TODO: Crea una struct Circle con il raggio dato
// TODO: Usa le funzioni di supporto circle_area e circle_circumference
// per calcolare e stampare i risultati
// Formato di stampa:
// printf("Area: %.2f\n", ...);
// printf("Circumference: %.2f\n", ...);
return 0;
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
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