Clases en C con struct: ejercicio resuelto de diseño modular

  3 minutos

Si buscas clases en C con struct, esta guía te muestra un enfoque práctico para modelar objetos sin POO nativa: struct + funciones + archivos separados.

La idea es aproximar encapsulación y responsabilidades claras en C puro.

Diseña un módulo Cuenta que:

  1. defina una entidad con titular y saldo,
  2. exponga funciones para crear, depositar, retirar y mostrar estado,
  3. separe interfaz (cuenta.h) e implementación (cuenta.c),
  4. use un main.c para probar el flujo completo.

cuenta.h

#ifndef CUENTA_H
#define CUENTA_H

typedef struct {
    char titular[64];
    double saldo;
} Cuenta;

Cuenta cuenta_crear(const char *titular, double saldo_inicial);
int cuenta_depositar(Cuenta *c, double importe);
int cuenta_retirar(Cuenta *c, double importe);
void cuenta_imprimir(const Cuenta *c);

#endif

cuenta.c

#include "cuenta.h"
#include <stdio.h>
#include <string.h>

Cuenta cuenta_crear(const char *titular, double saldo_inicial) {
    Cuenta c;
    strncpy(c.titular, titular, sizeof(c.titular) - 1);
    c.titular[sizeof(c.titular) - 1] = '\0';
    c.saldo = (saldo_inicial >= 0.0) ? saldo_inicial : 0.0;
    return c;
}

int cuenta_depositar(Cuenta *c, double importe) {
    if (!c || importe <= 0.0) return 0;
    c->saldo += importe;
    return 1;
}

int cuenta_retirar(Cuenta *c, double importe) {
    if (!c || importe <= 0.0 || importe > c->saldo) return 0;
    c->saldo -= importe;
    return 1;
}

void cuenta_imprimir(const Cuenta *c) {
    if (!c) return;
    printf("Titular: %s | Saldo: %.2f\n", c->titular, c->saldo);
}

main.c

#include "cuenta.h"
#include <stdio.h>

int main(void) {
    Cuenta c = cuenta_crear("Rodrigo", 1000.0);
    cuenta_imprimir(&c);

    cuenta_depositar(&c, 250.0);
    cuenta_retirar(&c, 400.0);
    cuenta_imprimir(&c);

    if (!cuenta_retirar(&c, 2000.0)) {
        printf("Retirada rechazada por saldo insuficiente.\n");
    }

    return 0;
}

Compilación:

gcc -Wall -Wextra -std=c11 main.c cuenta.c -o cuenta_demo
Titular: Rodrigo | Saldo: 1000.00
Titular: Rodrigo | Saldo: 850.00
Retirada rechazada por saldo insuficiente.
  • Exponer toda la lógica en main.c y perder modularidad.
  • No validar punteros ni importes antes de operar.
  • Copiar cadenas sin límite y arriesgar desbordamientos.
  • Pensar que esto es POO completa: en C no hay herencia ni métodos nativos.

Este patrón te sirve para:

  • diseñar módulos mantenibles en C,
  • separar API pública y detalles internos,
  • preparar código base para proyectos más grandes.

Es un enfoque útil cuando quieres estructura de “objeto” sin salir del lenguaje C.

Si quieres una ruta completa con progresión real de dificultad:

No de forma nativa. Puedes simular parte del diseño con struct, funciones y punteros, pero sin herencia ni polimorfismo integrado.

Porque mejora mantenimiento, facilita reutilización y deja clara la interfaz pública del módulo.

Para ambos casos. En entrevistas demuestra diseño limpio, y en proyectos reales evita código monolítico difícil de mantener.