Accesso ai membri della classe base
Fa parte della sezione Programmazione orientata agli oggetti del percorso C di Coddy. Lezione 30 di 61.
Ora che abbiamo compreso l'incorporamento delle struct e la regola del primo membro, concentriamoci sull'aspetto pratico: come leggere e modificare i dati del genitore incorporato all'interno di una funzione.
Quando una funzione riceve una struct Child (o un puntatore a una struct di questo tipo), per accedere ai membri del genitore è necessario navigare attraverso la struct incorporata. La sintassi dipende dal fatto che tu stia lavorando con un valore o con un puntatore.
typedef struct {
int id;
int score;
} Parent;
typedef struct {
Parent parent;
char grade;
} Child;Con un puntatore a Child, usa l’operatore freccia per raggiungere il genitore, poi il punto per accedere ai suoi membri:
void update_score(Child* c, int new_score) {
c->parent.score = new_score; // Freccia, poi punto
}
void print_info(Child* c) {
printf("ID: %d, Score: %d\n", c->parent.id, c->parent.score);
}Con un valore (passato per copia), usa i punti ovunque:
void show_id(Child c) {
printf("ID: %d\n", c.parent.id); // Punto e poi punto
}Questo schema di accesso concatenato, child->parent.member o child.parent.member, è il modo in cui interagisci con i dati ereditati nel modello di composizione di C. È leggermente più prolisso rispetto alla vera ereditarietà, ma rende esplicita e chiara la relazione tra i tipi.
Sfida
FacileCostruiamo un sistema di valutazione degli studenti che mostra come accedere ai dati all'interno di una struct incorporata e modificarli. Creerai una gerarchia in cui uno Student contiene una Person incorporata, poi scriverai funzioni che operano sui dati del genitore tramite il figlio.
Organizzerai il codice in tre file:
student.h: Definisci la gerarchia delle struct con le protezioni di inclusione. Crea una structPersonconname(un array di caratteri di 50 caratteri) eage(un intero). Poi definisci una structStudentche incorporaPersoncome primo membro e aggiunge un campograde(un intero che rappresenta il punteggio). Dichiara due funzioni:set_person_age, che accetta unStudent*e un nuovo valore per l'età, eprint_student, che accetta unStudent*e visualizza tutte le informazioni.student.c: Implementa entrambe le funzioni. La funzioneset_person_agedeve modificare l'età all'interno della structPersonincorporata. Qui farai pratica con la sintassi freccia-punto (s->person.age). La funzioneprint_studentdeve accedere a tutti i campi della persona incorporata e dello studente stesso e visualizzarli.main.c: Crea una variabileStudente inizializza tutti i suoi campi. Poi usaset_person_ageper aggiornare l'età della persona incorporata e chiamaprint_studentper visualizzare il risultato.
Riceverai quattro input: il nome dello studente (una stringa), la sua età iniziale (un intero), il suo voto (un intero) e una nuova età (un intero da impostare tramite la tua funzione).
Nel tuo file principale, crea lo studente con i valori iniziali, poi chiama set_person_age per cambiare l'età impostandola al nuovo valore e infine chiama print_student per visualizzare le informazioni aggiornate.
Il tuo output dovrebbe essere simile a questo:
Name: Emma
Age: 21
Grade: 85Dove Emma è il nome, 21 è l'età aggiornata (non quella iniziale) e 85 è il voto. L'apprendimento fondamentale consiste nel navigare nella struct incorporata per leggere e modificare i membri del genitore.
Provalo tu
#include <stdio.h>
#include <string.h>
#include "student.h"
int main() {
char name[50];
int initial_age, grade, new_age;
// Leggi gli input
fgets(name, 50, stdin);
name[strcspn(name, "\n")] = '\0'; // Rimuovi il carattere di nuova riga
scanf("%d", &initial_age);
scanf("%d", &grade);
scanf("%d", &new_age);
// TODO: Crea una variabile Student
// TODO: Inizializza tutti i campi dello studente
// - Copia name nel campo name della persona incorporata usando strcpy
// - Imposta il campo age della persona incorporata su initial_age
// - Imposta il campo grade dello studente
// TODO: Chiama set_person_age per aggiornare l'età a new_age
// TODO: Chiama print_student per visualizzare il risultato
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