Menu
CoddyTech

Acessando membros do tipo pai

Parte da seção Programação Orientada a Objetos do Journey de C da Coddy. Lição 30 de 61.

Agora que entendemos a incorporação de structs e a regra do primeiro membro, vamos nos concentrar no aspecto prático: como ler e modificar os dados do pai incorporado dentro de uma função.

Quando uma função recebe uma struct Child (ou um ponteiro para uma), acessar os membros do pai exige navegar pela struct incorporada. A sintaxe depende de você estar trabalhando com um valor ou um ponteiro.

typedef struct {
    int id;
    int score;
} Parent;

typedef struct {
    Parent parent;
    char grade;
} Child;

Com um ponteiro para Child, use o operador seta para acessar o pai e, em seguida, o ponto para acessar seus membros:

void update_score(Child* c, int new_score) {
    c->parent.score = new_score;  // Seta e depois ponto
}

void print_info(Child* c) {
    printf("ID: %d, Score: %d\n", c->parent.id, c->parent.score);
}

Com um valor (passado por cópia), use pontos em toda parte:

void show_id(Child c) {
    printf("ID: %d\n", c.parent.id);  // Ponto seguido de ponto
}

Esse padrão de acesso encadeado, child->parent.member ou child.parent.member, é como você interage com dados herdados no modelo de composição de C. Ele é um pouco mais verboso do que a herança verdadeira, mas deixa explícita e clara a relação entre os tipos.

challenge icon

Desafio

Fácil

Vamos criar um sistema de notas de alunos que demonstra como acessar e modificar dados dentro de uma struct incorporada. Você criará uma hierarquia em que uma Student contém uma Person incorporada e, em seguida, escreverá funções que trabalham com os dados da estrutura pai por meio da estrutura filha.

Você organizará seu código em três arquivos:

  • student.h: Defina sua hierarquia de structs com proteções de inclusão. Crie uma struct Person com name (um array de caracteres de 50 caracteres) e age (um inteiro). Em seguida, defina uma struct Student que incorpora Person como seu primeiro membro e adiciona um campo grade (um inteiro que representa a nota do aluno). Declare duas funções: set_person_age, que recebe um Student* e um novo valor de idade, e print_student, que recebe um Student* e exibe todas as informações.
  • student.c: Implemente as duas funções. Sua função set_person_age deve modificar a idade dentro da struct Person incorporada. É aqui que você praticará a sintaxe de seta seguida de ponto (s->person.age). Sua função print_student deve acessar e exibir todos os campos tanto da pessoa incorporada quanto do próprio aluno.
  • main.c: Crie uma variável Student e inicialize todos os seus campos. Em seguida, use set_person_age para atualizar a idade da pessoa incorporada e chame print_student para exibir o resultado.

Você receberá quatro entradas: o nome do aluno (uma string), a idade inicial dele (um inteiro), a nota dele (um inteiro) e uma nova idade (um inteiro para atualizar por meio da sua função).

No seu arquivo principal, crie o aluno com os valores iniciais, depois chame set_person_age para alterar a idade para o novo valor e, por fim, chame print_student para exibir as informações atualizadas.

Sua saída deve ser assim:

Name: Emma
Age: 21
Grade: 85

Onde Emma é o nome, 21 é a idade atualizada (não a idade inicial) e 85 é a nota. O principal aprendizado aqui é navegar pela struct incorporada para ler e escrever os membros da estrutura pai.

Experimente você mesmo

#include <stdio.h>
#include <string.h>
#include "student.h"

int main() {
    char name[50];
    int initial_age, grade, new_age;
    
    // Leia as entradas
    fgets(name, 50, stdin);
    name[strcspn(name, "\n")] = '\0';  // Remova a quebra de linha
    scanf("%d", &initial_age);
    scanf("%d", &grade);
    scanf("%d", &new_age);
    
    // TODO: Crie uma variável Student
    
    // TODO: Inicialize todos os campos do estudante
    // - Copie name para o nome da pessoa incorporada usando strcpy
    // - Defina a idade da pessoa incorporada como initial_age
    // - Defina a nota do estudante
    
    // TODO: Chame set_person_age para atualizar a idade para new_age
    
    // TODO: Chame print_student para exibir o resultado
    
    return 0;
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de C online