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.
Desafio
FácilVamos 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 structPersoncomname(um array de caracteres de 50 caracteres) eage(um inteiro). Em seguida, defina uma structStudentque incorporaPersoncomo seu primeiro membro e adiciona um campograde(um inteiro que representa a nota do aluno). Declare duas funções:set_person_age, que recebe umStudent*e um novo valor de idade, eprint_student, que recebe umStudent*e exibe todas as informações.student.c: Implemente as duas funções. Sua funçãoset_person_agedeve modificar a idade dentro da structPersonincorporada. É aqui que você praticará a sintaxe de seta seguida de ponto (s->person.age). Sua funçãoprint_studentdeve acessar e exibir todos os campos tanto da pessoa incorporada quanto do próprio aluno.main.c: Crie uma variávelStudente inicialize todos os seus campos. Em seguida, useset_person_agepara atualizar a idade da pessoa incorporada e chameprint_studentpara 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: 85Onde 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;
}
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
1Fundamentos da Programação Modular
Arquivos de cabeçalhoProteções de inclusãoArquivos-fonteFunções estáticasRevisão: calculadora modular4Encapsulamento
Conceito de ponteiros opacosDefinindo structs opacasGetters e settersValidação em settersRevisão: caixa secreta2Objetos e métodos
Structs como objetosO ponteiro 'Self'Correção de constPonteiro vs. valorMétodos auxiliaresRevisão: Gerenciador de pontos5Projeto: Conta Bancária Simples
Configuração do ProjetoImplementação da Conta3Ciclo de vida do objeto
Padrão de construtorPadrão de destrutorInicialização da pilhaCópia profundaRevisão: wrapper de String6Herança por composição
Incorporação de structRegra do primeiro membroAcessando membros do tipo paiUpcastingRevisão: hierarquia de formas9Projeto: Desenhador de Formas
Visão geral do projetoImplementação do círculoImplementação do retânguloUso polimórficoContêiner de formasPratique por conta própria: Compilador de C online