Menu
Coddy logo textTech

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.

challenge icon

Sfida

Facile

Costruiamo 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 struct Book con due membri: char *title (un puntatore a una stringa allocata dinamicamente) e int pages. Dichiara anche una funzione costruttrice create_book che 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 simbolo BOOK_H.
  • book.c: implementa la funzione create_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: 272

Ricorda 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;
}
quiz iconMettiti alla prova

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

Esercitati da solo: Compilatore C online