Acessando Membros 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 da struct 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 de 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 então ponto
}Este padrão de acesso encadeado, child->parent.member ou child.parent.member, é a forma de interagir com dados herdados no modelo de composição de C. Ele é um pouco mais verboso do que a herança verdadeira, mas é explícito e deixa 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 na qual uma Student contém uma Person incorporada e, em seguida, escreverá funções que trabalham com os dados do pai por meio do filho.
Você organizará seu código em três arquivos:
student.h: Defina sua hierarquia de structs com guardas 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 sua nota). 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 ambas as funções. Sua funçãoset_person_agedeve modificar a idade dentro da structPersonincorporada. É aqui que você praticará a sintaxe seta-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), sua idade inicial (um inteiro), sua nota (um inteiro) e uma nova idade (um inteiro para atualizar por meio da sua função).
Em 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 semelhante a esta:
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 struct pai.
Experimente você mesmo
#include <stdio.h>
#include <string.h>
#include "student.h"
int main() {
char name[50];
int initial_age, grade, new_age;
// Ler entradas
fgets(name, 50, stdin);
name[strcspn(name, "\n")] = '\0'; // Remover newline
scanf("%d", &initial_age);
scanf("%d", &grade);
scanf("%d", &new_age);
// TODO: Criar uma variável Student
// TODO: Inicializar todos os campos do student
// - Copiar name para o name da person embutida usando strcpy
// - Definir a age da person embutida como initial_age
// - Definir o grade do student
// TODO: Chamar set_person_age para atualizar a age para new_age
// TODO: Chamar 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çalhoInclude GuardsArquivos-FonteFunções EstáticasRecapitulação: Calculadora Modular4Encapsulamento
Conceito de Ponteiros OpacosDefinindo Structs OpacasGetters e SettersValidação em SettersRecapitulação: Caixa Secreta2Objetos e Métodos
Structs como ObjetosO Ponteiro 'Self'Const CorrectnessPonteiro vs ValorMétodos AuxiliaresRecapitulação: Point Manager5Projeto: Conta Bancária Simples
Configuração do ProjetoImplementação da Conta3Ciclo de Vida de Objetos
Padrão de ConstrutorPadrão de DestrutorInicialização na StackCópia ProfundaRecapitulação: String Wrapper6Herança via Composição
Incorporação de StructsA Regra do Primeiro MembroAcessando Membros PaiUpcastingRecapitulação: Hierarquia de Formas9Projeto: Desenhador de Formas
Visão Geral do ProjetoImplementação do CírculoImplementação do RetânguloUso PolimórficoContainer de FormasPratique por conta própria: Compilador de C online