Incrustación de Structs
Parte de la sección Programación Orientada a Objetos del Journey de C de Coddy. Lección 28 de 61.
En lenguajes orientados a objetos como C++ o Java, la herencia permite que una clase adquiera propiedades de una clase principal. C no tiene herencia integrada, pero podemos simularla mediante una técnica llamada composición: colocar una estructura dentro de otra.
La idea es simple: si un Child necesita todas las propiedades de un Parent, incrustamos la estructura Parent como miembro de Child.
typedef struct {
int id;
char name[50];
} Parent;
typedef struct {
Parent parent; // Estructura embebida
int grade;
} Child;Aquí, Child contiene todo lo que tiene Parent, además de su propio campo grade. Esto es composición: el hijo «tiene un» padre en lugar de «ser un» padre, pero el efecto es similar a la herencia.
Para acceder a los miembros del padre a través de una instancia hija, usas el operador de punto dos veces:
Child c;
c.parent.id = 101;
c.parent.name[0] = 'A';
c.grade = 5;Este patrón forma la base para construir jerarquías de tipos en C. Al incorporar una estructura base como el primer miembro, desbloqueamos técnicas potentes que exploraremos en las próximas lecciones.
Desafío
FácilConstruyamos un sistema sencillo de gestión de empleados que demuestre la incrustación de estructuras: la base de la herencia en C.
Crearás una jerarquía en la que un Employee contiene un Person. Esto refleja cómo funciona la herencia: un empleado «es un» persona con información adicional relacionada con su trabajo. Al incrustar la estructura Person dentro de Employee, obtienes todas las propiedades de la persona, además de los campos específicos del empleado.
Organizarás tu código en tres archivos:
types.h: Define aquí ambas estructuras con protectores de inclusión. Primero, crea una estructuraPersoncon dos campos:name(un arreglo de caracteres de 50 caracteres) yage(un entero). Después, define una estructuraEmployeeque incrustePersoncomo su primer miembro y añada un campoemployee_id(un entero).types.c: Implementa una función llamadaprint_employeeque reciba un puntero a unEmployeey muestre su información. Accede a los datos de la persona incrustada utilizando la sintaxis encadenada de punto/flecha que aprendiste.main.c: Crea una variableEmployee, completa todos sus campos (incluidos el nombre y la edad de la persona incrustada) y utiliza tu función de impresión para mostrar la información.
Recibirás tres entradas: el nombre del empleado (una cadena), su edad (un entero) y su ID de empleado (un entero).
Tu función print_employee debe mostrar la información del empleado con este formato:
Employee: Alice
Age: 28
ID: 1001Donde Alice es el nombre, 28 es la edad y 1001 es el ID de empleado de tus entradas.
Recuerda acceder a los miembros de la estructura incrustada a través del miembro padre; por ejemplo, para llegar al nombre, primero navegarás a través del miembro person.
Pruébalo tú mismo
#include <stdio.h>
#include <string.h>
#include "types.h"
int main() {
// Leer entrada
char name[50];
int age;
int employee_id;
fgets(name, 50, stdin);
name[strcspn(name, "\n")] = '\0'; // Eliminar salto de línea
scanf("%d", &age);
scanf("%d", &employee_id);
// TODO: Crea una variable Employee
// TODO: Rellena el nombre y la edad de la persona embebida
// Hint: Usa strcpy para el nombre, accede con employee.person.name
// TODO: Establece el employee_id
// TODO: Llama a print_employee con un puntero a tu employee
return 0;
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de programación modular
Archivos de cabeceraGuardas de inclusiónArchivos fuenteFunciones estáticasRepaso: Calculadora modular4Encapsulamiento
Concepto de punteros opacosDefinición de structs opacosGetters y SettersValidación en settersResumen: Caja secreta7Punteros a funciones
Declaración de punteros a funcionesLlamada a punteros a funcionesTypedef para punteros a funcionesPasar funciones como argumentosRepaso: Dispatch de calculadora10Contenedores genéricos
Repaso de punteros voidWrapper genéricoSwap genéricoComparación genéricaRepaso: Array genérico2Objetos y métodos
Structs como objetosEl puntero 'Self'Const CorrectnessPuntero vs. ValorMétodos auxiliaresResumen: Point Manager5Proyecto: Cuenta bancaria simple
Configuración del proyectoImplementación de la cuenta3Ciclo de vida de los objetos
Patrón ConstructorPatrón DestructorInicialización en StackCopia profundaResumen: String Wrapper6Herencia mediante composición
Incrustación de StructsLa regla del primer miembroAcceso a miembros padreUpcastingResumen: Jerarquía de formas9Proyecto: Dibujador de figuras
Descripción general del proyectoImplementación del círculoImplementación del rectánguloUso polimórficoContenedor de figurasPractica por tu cuenta: Compilador de C online