Incorporamento delle struct
Fa parte della sezione Programmazione orientata agli oggetti del percorso C di Coddy. Lezione 28 di 61.
Nei linguaggi orientati agli oggetti come C++ o Java, l’ereditarietà consente a una classe di acquisire proprietà da una classe genitore. C non dispone di ereditarietà integrata, ma possiamo simularla usando una tecnica chiamata composizione: inserire una struct all’interno di un’altra.
L'idea è semplice: se un Child ha bisogno di tutte le proprietà di un Parent, incorporiamo la struct Parent come membro di Child.
typedef struct {
int id;
char name[50];
} Parent;
typedef struct {
Parent parent; // Struttura incorporata
int grade;
} Child;Qui, Child contiene tutto ciò che ha Parent, oltre al proprio campo grade. Questa è composizione: il figlio "ha un" genitore invece di "essere un" genitore, ma l'effetto è simile all'ereditarietà.
Per accedere ai membri del genitore tramite un'istanza figlia, usa due volte l'operatore punto:
Child c;
c.parent.id = 101;
c.parent.name[0] = 'A';
c.grade = 5;Questo schema costituisce la base per creare gerarchie di tipi in C. Incorporando una struct base come primo membro, possiamo sfruttare tecniche potenti che esploreremo nelle prossime lezioni.
Sfida
FacileCostruiamo un semplice sistema di gestione dei dipendenti che dimostri l'incorporamento delle struct: la base dell'ereditarietà in C.
Creerai una gerarchia in cui un Employee contiene un Person. Questo rispecchia il funzionamento dell'ereditarietà: un dipendente «è una» persona con informazioni aggiuntive relative al lavoro. Incorporando la struct Person all'interno di Employee, ottieni tutte le proprietà della persona, oltre ai campi specifici del dipendente.
Organizzerai il codice in tre file:
types.h: Definisci qui entrambe le struct con le include guard. Per prima cosa, crea una structPersoncon due campi:name(un array di caratteri di 50 caratteri) eage(un intero). Poi definisci una structEmployeeche incorporaPersoncome primo membro e aggiunge un campoemployee_id(un intero).types.c: Implementa una funzione chiamataprint_employeeche accetta un puntatore a unEmployeee stampa le sue informazioni. Accedi ai dati della persona incorporata usando la sintassi concatenata con punto/freccia che hai imparato.main.c: Crea una variabileEmployee, valorizza tutti i suoi campi (inclusi il nome e l'età della persona incorporata) e usa la funzione di stampa per visualizzare le informazioni.
Riceverai tre input: il nome del dipendente (una stringa), la sua età (un intero) e il suo ID dipendente (un intero).
La tua funzione print_employee dovrebbe stampare le informazioni del dipendente in questo formato:
Employee: Alice
Age: 28
ID: 1001Dove Alice è il nome, 28 è l'età e 1001 è l'ID dipendente inserito come input.
Ricorda di accedere ai membri della struct incorporata tramite il membro genitore; per esempio, per raggiungere il nome, dovrai passare prima attraverso il membro person.
Provalo tu
#include <stdio.h>
#include <string.h>
#include "types.h"
int main() {
// Leggi l'input
char name[50];
int age;
int employee_id;
fgets(name, 50, stdin);
name[strcspn(name, "\n")] = '\0'; // Rimuovi il carattere di nuova riga
scanf("%d", &age);
scanf("%d", &employee_id);
// TODO: Crea una variabile Employee
// TODO: Assegna il nome e l'età alla persona incorporata
// Suggerimento: usa strcpy per il nome, accedendo tramite employee.person.name
// TODO: Imposta employee_id
// TODO: Chiama print_employee passando un puntatore al tuo employee
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