Menu
Coddy logo textTech

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.

challenge icon

Sfida

Facile

Costruiamo 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 struct Person con name (un array di caratteri di 50 caratteri) e age (un intero). Poi definisci una struct Student che incorpora Person come primo membro e aggiunge un campo grade (un intero che rappresenta il punteggio). Dichiara due funzioni: set_person_age, che accetta un Student* e un nuovo valore per l'età, e print_student, che accetta un Student* e visualizza tutte le informazioni.
  • student.c: Implementa entrambe le funzioni. La funzione set_person_age deve modificare l'età all'interno della struct Person incorporata. Qui farai pratica con la sintassi freccia-punto (s->person.age). La funzione print_student deve accedere a tutti i campi della persona incorporata e dello studente stesso e visualizzarli.
  • main.c: Crea una variabile Student e inizializza tutti i suoi campi. Poi usa set_person_age per aggiornare l'età della persona incorporata e chiama print_student per 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: 85

Dove 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;
}
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