Incorporação de struct
Parte da seção Programação Orientada a Objetos do Journey de C da Coddy. Lição 28 de 61.
Em linguagens orientadas a objetos como C++ ou Java, a herança permite que uma classe adquira propriedades de uma classe pai. C não tem herança integrada, mas podemos simulá-la usando uma técnica chamada composição: colocar uma struct dentro de outra.
A ideia é simples: se um Child precisa de todas as propriedades de um Parent, incorporamos a struct Parent como membro de Child.
typedef struct {
int id;
char name[50];
} Parent;
typedef struct {
Parent parent; // Struct incorporada
int grade;
} Child;Aqui, Child contém tudo o que Parent tem, além de seu próprio campo grade. Isso é composição: o filho “tem um” pai, em vez de “ser um” pai, mas o efeito é semelhante ao da herança.
Para acessar os membros da classe pai por meio de uma instância da classe filha, você usa o operador ponto duas vezes:
Child c;
c.parent.id = 101;
c.parent.name[0] = 'A';
c.grade = 5;Esse padrão forma a base para construir hierarquias de tipos em C. Ao incorporar uma struct base como o primeiro membro, desbloqueamos técnicas poderosas que exploraremos nas próximas lições.
Desafio
FácilVamos criar um sistema simples de gerenciamento de funcionários que demonstra a incorporação de structs: a base da herança em C.
Você criará uma hierarquia em que um Employee contém um Person. Isso reflete como a herança funciona: um funcionário “é uma” pessoa com informações adicionais relacionadas ao trabalho. Ao incorporar a struct Person dentro de Employee, você obtém todas as propriedades da pessoa, além dos campos específicos do funcionário.
Você organizará seu código em três arquivos:
types.h: Defina as duas structs aqui, com guardas de inclusão. Primeiro, crie uma structPersoncom dois campos:name(um array de caracteres com 50 caracteres) eage(um inteiro). Depois, defina uma structEmployeeque incorporePersoncomo seu primeiro membro e adicione um campoemployee_id(um inteiro).types.c: Implemente uma função chamadaprint_employeeque recebe um ponteiro para umEmployeee imprime suas informações. Acesse os dados da pessoa incorporada usando a sintaxe encadeada de ponto/seta que você aprendeu.main.c: Crie uma variávelEmployee, preencha todos os seus campos (incluindo o nome e a idade da pessoa incorporada) e use sua função de impressão para exibir as informações.
Você receberá três entradas: o nome do funcionário (uma string), a idade (um inteiro) e o ID do funcionário (um inteiro).
Sua função print_employee deve exibir as informações do funcionário neste formato:
Employee: Alice
Age: 28
ID: 1001Onde Alice é o nome, 28 é a idade e 1001 é o ID do funcionário fornecido nas entradas.
Lembre-se de acessar os membros da struct incorporada por meio do membro pai. Por exemplo, para acessar o nome, você passará primeiro pelo membro person.
Experimente você mesmo
#include <stdio.h>
#include <string.h>
#include "types.h"
int main() {
// Leia a entrada
char name[50];
int age;
int employee_id;
fgets(name, 50, stdin);
name[strcspn(name, "\n")] = '\0'; // Remova a quebra de linha
scanf("%d", &age);
scanf("%d", &employee_id);
// TODO: Crie uma variável do tipo Employee
// TODO: Preencha o nome e a idade da pessoa incorporada
// Dica: Use strcpy para o nome; acesse-o com employee.person.name
// TODO: Defina employee_id
// TODO: Chame print_employee com um ponteiro para seu empregado
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