Pattern del costruttore
Fa parte della sezione Programmazione orientata agli oggetti del percorso C di Coddy. Lezione 12 di 61.
In linguaggi come Java o C++, crei oggetti usando i costruttori: funzioni speciali che allocano automaticamente la memoria e inizializzano i campi. C non ha questa funzionalità, ma possiamo simularla con un semplice schema: una funzione create_.
Una funzione costruttrice in C in genere fa tre cose: alloca memoria con malloc, inizializza tutti i campi con valori appropriati e restituisce un puntatore al nuovo oggetto:
typedef struct {
char *name;
int age;
} Person;
Person *create_person(const char *name, int age) {
Person *p = malloc(sizeof(Person));
p->name = malloc(strlen(name) + 1);
strcpy(p->name, name);
p->age = age;
return p;
}
La funzione restituisce un puntatore perché l'oggetto vive nell'heap, non nello stack. Ciò significa che persiste dopo la restituzione della funzione e può essere passato liberamente. Il chiamante lo usa così:
Person *alice = create_person("Alice", 30);
printf("%s is %d years old\n", alice->name, alice->age);
Nota come il costruttore gestisce tutti i dettagli complicati: allocare la struct, allocare spazio per la stringa e copiare i dati. Chi chiama fornisce semplicemente i valori iniziali e riceve un oggetto pronto all’uso. Questo racchiude la logica di creazione in un unico punto, rendendo il codice più pulito e meno soggetto a errori.
Sfida
FacileCostruiamo un modulo Book che usa il pattern del costruttore per creare oggetti libro nell'heap. Ti eserciterai a scrivere una funzione create_ che gestisce tutta l'allocazione e l'inizializzazione della memoria, restituendo un puntatore pronto all'uso.
Creerai tre file:
book.h: dichiara una structBookcon due membri:char *title(un puntatore a una stringa allocata dinamicamente) eint pages. Dichiara anche una funzione costruttricecreate_bookche accetta una stringa per il titolo e il numero di pagine, quindi restituisce un puntatore a un nuovo Book. Usa le protezioni di inclusione con il simboloBOOK_H.book.c: implementa la funzionecreate_book. Il costruttore dovrebbe allocare memoria per la struct Book stessa, poi allocare memoria separata per la stringa del titolo (ricordati di considerare il terminatore nullo), copiare il titolo nella nuova memoria, impostare il campo pages e restituire il puntatore al nuovo Book.main.c: usa il costruttore per creare un libro e visualizzarne le informazioni.
Riceverai due input: il titolo del libro (una stringa) e il numero di pagine (un intero).
Nel file principale, usa create_book per creare un nuovo libro con i valori forniti, poi stampa le sue informazioni in questo formato:
Title: {title}
Pages: {pages}Per esempio, con gli input The C Programming Language e 272, l'output sarebbe:
Title: The C Programming Language
Pages: 272Ricorda che il costruttore incapsula tutta la logica di creazione: chi lo chiama fornisce semplicemente i valori iniziali e riceve un oggetto completamente inizializzato e pronto all'uso.
Provalo tu
#include <stdio.h>
#include <stdlib.h>
#include "book.h"
int main() {
char title[256];
int pages;
// Leggi l'input
fgets(title, sizeof(title), stdin);
// Rimuovi il carattere di nuova riga, se presente
for (int i = 0; title[i]; i++) {
if (title[i] == '\n') {
title[i] = '\0';
break;
}
}
scanf("%d", &pages);
// TODO: Usa create_book per creare un nuovo libro con i valori forniti
// TODO: Stampa le informazioni del libro nel formato richiesto:
// Titolo: {title}
// Pagine: {pages}
// TODO: Non dimenticare di liberare la memoria allocata al termine
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