Menu
Coddy logo textTech

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.

quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Object Oriented Programming