Inizializzazione sullo stack
Fa parte della sezione Programmazione orientata agli oggetti del percorso C di Coddy. Lezione 14 di 61.
Non tutti gli oggetti devono risiedere nell'heap. Quando una struct è piccola e ha una vita breve, allocarla nello stack è più semplice e veloce: niente malloc, niente free, nessun rischio di perdite di memoria.
Invece di restituire un puntatore, una funzione factory può restituire la struct per valore. L’intera struct viene copiata al chiamante:
typedef struct {
int x;
int y;
} Point;
Point create_point(int x, int y) {
Point p;
p.x = x;
p.y = y;
return p;
}
Il chiamante riceve una copia completamente inizializzata:
Point origin = create_point(0, 0);
Point cursor = create_point(100, 50);
printf("Cursor: (%d, %d)\n", cursor.x, cursor.y);
Nessun puntatore, nessuna pulizia necessaria. Quando origin e cursor escono dall'ambito, vengono distrutti automaticamente.
Questo approccio funziona meglio per le struct piccole senza membri allocati dinamicamente. Per gli oggetti più grandi o quelli che contengono puntatori alla memoria heap, il modello del costruttore con malloc resta la scelta migliore.
Sfida
FacileCreiamo un modulo Temperature che genera letture di temperatura nello stack usando una funzione factory. A differenza dei costruttori basati sull'heap delle lezioni precedenti, questo approccio restituisce la struct per valore: niente malloc, niente free, solo un'allocazione semplice ed efficiente nello stack.
Creerai tre file:
temperature.h: dichiara una structTemperaturecon due membri:double celsiusechar scale(per memorizzare 'C' per Celsius). Dichiara anche due funzioni:create_temperature: accetta un valore double e restituisce una structTemperatureper valore (non un puntatore!)temperature_to_fahrenheit: accetta unconst Temperature *e restituisce la temperatura equivalente in Fahrenheit come double
TEMPERATURE_H.temperature.c: implementa entrambe le funzioni. La funzione factory deve creare una variabile localeTemperature, inizializzarne i campi (impostarescalea'C') e restituirla. La formula di conversione è:fahrenheit = celsius * 9.0 / 5.0 + 32.0main.c: usa la funzione factory per creare una lettura della temperatura e mostrare i valori in Celsius e Fahrenheit.
Riceverai un input: la temperatura in Celsius (come double).
Nel file principale, usa create_temperature per creare una struct Temperature con il valore fornito. Poi stampa il valore originale in Celsius e il suo equivalente in Fahrenheit.
Stampa l'output in questo formato:
Celsius: {celsius}
Fahrenheit: {fahrenheit}Usa %.2f per entrambi i valori, per visualizzare due cifre decimali.
Ad esempio, con un input di 25.0, l'output sarebbe:
Celsius: 25.00
Fahrenheit: 77.00Nota quanto è semplice questo approccio. Ottieni una struct completamente inizializzata senza preoccuparti della gestione della memoria. Quando la variabile Temperature esce dall'ambito, viene ripulita automaticamente.
Provalo tu
#include <stdio.h>
#include "temperature.h"
int main() {
double celsius_input;
scanf("%lf", &celsius_input);
// TODO: Usa create_temperature para crear una struct Temperature
// TODO: Imprime el valor en grados Celsius con el formato %.2f
// TODO: Usa temperature_to_fahrenheit para convertir e imprimir el valor en grados Fahrenheit
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