Structs como objetos
Parte de la sección Programación Orientada a Objetos del Journey de C de Coddy. Lección 6 de 61.
En los lenguajes orientados a objetos, un objeto es una entidad que combina datos (estado) con funciones que operan sobre esos datos (métodos). C no tiene objetos integrados, pero podemos lograr el mismo concepto usando estructuras y funciones.
Piensa en una estructura como la parte de «datos» de un objeto. Contiene el estado: los valores que definen qué es actualmente el objeto:
typedef struct {
int value;
} Counter;
Esta estructura Counter representa una entidad con un único elemento de estado: su valor actual. Para dotarla de comportamiento, escribimos funciones que aceptan la estructura como parámetro:
void counter_increment(Counter *c) {
c->value++;
}
int counter_get(Counter *c) {
return c->value;
}
Estas funciones actúan como métodos. Operan específicamente sobre datos de Counter. Al pasar la estructura struct a las funciones, simulamos lo que otros lenguajes hacen automáticamente cuando llamas a counter.increment().
int main() {
Counter my_counter = {0};
counter_increment(&my_counter);
printf("%d\n", counter_get(&my_counter)); // Imprime: 1
return 0;
}
La convención de nomenclatura typename_action (como counter_increment) ayuda a organizar tu código y deja claro a qué estructura pertenece una función. Este patrón es la base de la programación orientada a objetos en C.
Desafío
FácilConstruyamos un módulo Counter sencillo que trate una estructura como un objeto con comportamiento. Organizarás tu código en tres archivos para practicar el patrón de agrupar datos con las funciones que operan sobre ellos.
Crearás tres archivos:
counter.h: Tu archivo de encabezado que declara la estructuraCountercon un único miembroint value. Declara también dos funciones que actúan como «métodos» del contador:counter_increment(recibe un puntero a Counter y aumenta su valor en 1) ycounter_get(recibe un puntero a Counter y devuelve su valor actual). Usa protectores de inclusión con el símboloCOUNTER_H.counter.c: Tu archivo fuente que implementa ambas funciones. Recuerda incluir tu archivo de encabezado.main.c: Tu archivo principal que crea un Counter, realiza operaciones sobre él y muestra los resultados.
Recibirás dos entradas enteras: el valor inicial de tu contador y el número de veces que se incrementará.
En tu archivo principal, inicializa un Counter con el valor inicial y, después, llama a counter_increment el número de veces especificado. Finalmente, usa counter_get para obtener e imprimir el valor final.
Imprime el resultado con este formato:
Final value: {result}Por ejemplo, con un valor inicial de 5 y 3 incrementos, la salida sería:
Final value: 8Pruébalo tú mismo
#include <stdio.h>
#include "counter.h"
int main() {
// Leer la entrada
int starting_value;
int num_increments;
scanf("%d", &starting_value);
scanf("%d", &num_increments);
// TODO: Crea un Counter e inicialízalo con starting_value
// TODO: Llama a counter_increment el número de veces especificado
// TODO: Usa counter_get para obtener el valor final e imprímelo
// Formato de impresión: "Final value: {result}"
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