Concepto de punteros opacos
Parte de la sección Object Oriented Programming del Journey de C de Coddy — lección 17 de 61.
Hasta ahora, cuando definimos un struct en un archivo de cabecera, cualquiera que incluya esa cabecera puede ver y acceder directamente a todos sus miembros. Esto rompe el encapsulamiento: el principio de ocultar los detalles internos del código externo.
C proporciona una técnica poderosa llamada punteros opacos para resolver esto. La idea es simple: declarar que un struct existe en la cabecera, pero sin revelar qué hay en su interior. Esto se hace utilizando un tipo incompleto:
// wallet.h
typedef struct Wallet Wallet; // Solo declaración - ¡sin cuerpo!
Wallet *create_wallet(int initial_balance);
void free_wallet(Wallet *w);
Observa que no hay llaves: nunca definimos lo que contiene Wallet. El compilador sabe que el tipo existe, pero no su tamaño ni sus miembros. Esto significa que el código que incluye este encabezado solo puede trabajar con punteros a Wallet, nunca con la struct misma directamente.
¿Por qué es esto importante? Debido a que la definición real de la estructura (struct) reside oculta en el archivo .c, cualquier código que utilice su encabezado no puede escribir w->balance o sizeof(Wallet). Deben utilizar las funciones que usted proporciona. Usted controla todo el acceso a los datos y puede cambiar la estructura interna más adelante sin romper ningún código que dependa de su encabezado.
En la próxima lección, practicarás la definición del cuerpo real del struct dentro del archivo fuente, completando el patrón de puntero opaco.
Hoja de referencia
Un puntero opaco utiliza un tipo incompleto para ocultar los detalles de implementación de una estructura (struct), reforzando el encapsulamiento.
Declara la estructura en el encabezado sin definir su cuerpo:
// wallet.h
typedef struct Wallet Wallet; // Solo declaración - sin llaves
Wallet *create_wallet(int initial_balance);
void free_wallet(Wallet *w);
El compilador sabe que el tipo existe, pero no su tamaño ni sus miembros. Los usuarios solo pueden trabajar con punteros a la estructura y deben usar las funciones proporcionadas para interactuar con ella.
La definición real de la estructura se coloca en el archivo .c, lo que evita el acceso directo a los miembros como w->balance o el uso de sizeof(Wallet).
Pruébalo tú mismo
Esta lección no incluye un desafío de código.
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Object Oriented Programming
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írculo