Concepto de punteros opacos
Parte de la sección Programación Orientada a Objetos del Journey de C de Coddy. Lección 17 de 61.
Hasta ahora, cuando definimos un struct en un archivo de encabezado, cualquiera que incluya ese encabezado puede ver y acceder directamente a todos sus miembros. Esto rompe la encapsulación: el principio de ocultar los detalles internos del código externo.
C proporciona una técnica potente llamada punteros opacos para resolver esto. La idea es sencilla: declarar que una estructura existe en el archivo de encabezado, pero no revelar qué contiene. Esto se hace mediante 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 curly. Nunca definimos qué contiene Wallet. El compilador sabe que el tipo existe, pero no conoce su tamaño ni sus miembros. Esto significa que el código que incluye este encabezado solo puede trabajar con punteros a Wallet, nunca directamente con la estructura en sí.
¿Por qué es importante esto? Porque la definición real de la estructura vive oculta en el archivo .c, cualquier código que use tu encabezado no puede escribir w->balance ni sizeof(Wallet). Debe usar las funciones que proporcionas. Tú controlas todo el acceso a los datos y puedes cambiar la estructura interna más adelante sin romper ningún código que dependa de tu encabezado.
En la próxima lección, practicarás cómo definir el cuerpo real de la estructura dentro del archivo de origen, completando el patrón de puntero opaco.
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 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