Es posible emular, en C, el comportamiento de miembros privados de datos definidos por el programador, al estilo de la POO, para que los usuarios de esa estructura no puedan acceder directamente a los datos que hay dentro de ella.
Las ventajas que tiene esta técnica:
1. El usuario no puede modificar los datos directamente y deben pasar por los filtros que imponga el programador.
2. El programador puede cambiar los datos internos que tiene la estructura y su interfaz (funciones getters y setters) sin que el usuario tenga que recompilar todo su código para hacer uso de estas modificaciones.
Los inconvenientes:
1. Sólo se puede situar la estructura en memoria del montón con lo que aparece el problema de la fragmentación de la memoria
2. La memoria se debe liberar ya sea mediante free o una función que proporcione el programador a modo de destructor.
Aquí va el código:
dato.h
Código
#ifndef __DATO_H__ #define __DATO_H__ typedef struct __dato__ DATO; DATO* new_dato(); void delete_dato(DATO* objeto); int get_dato(DATO* objeto); void set_dato(DATO* objeto, int valor); #endif
dato.c
Código
#include <stdlib.h> #include "dato.h" struct __dato__ { int miembro_privado; }; DATO* new_dato() { d->miembro_privado = 0; return d; } void delete_dato(DATO* objeto) { } int get_dato(DATO* objeto) { return objeto->miembro_privado; } void set_dato(DATO* objeto, int valor) { objeto->miembro_privado = valor; }
Ahora el cliente:
main.c
Código
#include <stdio.h> #include "dato.h" int main() { DATO *d; d = new_dato(); set_dato(d, 5); /* d->miembro_privado = 4; /* <- Esto va a fallar */ /* printf("%i\n", get_dato(d)); */ delete_dato(d); return 0; }