Menu
Coddy logo textTech

Conceito de Ponteiros Opacos

Parte da seção Object Oriented Programming do Journey de C da Coddy — lição 17 de 61.

Até agora, quando definimos uma struct em um arquivo de cabeçalho, qualquer pessoa que inclua esse cabeçalho pode ver e acessar diretamente todos os seus membros. Isso quebra o encapsulamento — o princípio de ocultar detalhes internos do código externo.

C fornece uma técnica poderosa chamada ponteiros opacos (opaque pointers) para resolver isso. A ideia é simples: declarar que uma struct existe no header, mas não revelar o que há dentro dela. Isso é feito usando um tipo incompleto:

// wallet.h
typedef struct Wallet Wallet;  // Apenas declaração - sem corpo!

Wallet *create_wallet(int initial_balance);
void free_wallet(Wallet *w);

Observe que não há chaves — nunca definimos o que Wallet contém. O compilador sabe que o tipo existe, mas não o seu tamanho ou membros. Isso significa que o código que inclui este cabeçalho só pode trabalhar com ponteiros para Wallet, nunca com a struct em si diretamente.

Por que isso importa? Como a definição real da struct fica escondida no arquivo .c, qualquer código que use seu cabeçalho não pode escrever w->balance ou sizeof(Wallet). Eles devem usar as funções que você fornece. Você controla todo o acesso aos dados e pode alterar a estrutura interna posteriormente sem quebrar nenhum código que dependa do seu cabeçalho.

Na próxima lição, você praticará a definição do corpo real da struct dentro do arquivo de origem, completando o padrão opaque pointer.

Folha de consulta

Um ponteiro opaco utiliza um tipo incompleto para ocultar os detalhes de implementação da struct, reforçando o encapsulamento.

Declare a struct no cabeçalho sem definir seu corpo:

// wallet.h
typedef struct Wallet Wallet;  // Apenas declaração - sem chaves

Wallet *create_wallet(int initial_balance);
void free_wallet(Wallet *w);

O compilador sabe que o tipo existe, mas não o seu tamanho ou membros. Os usuários só podem trabalhar com ponteiros para a struct e devem usar as funções fornecidas para interagir com ela.

A definição real da struct é colocada no arquivo .c, impedindo o acesso direto aos membros como w->balance ou o uso de sizeof(Wallet).

Experimente você mesmo

Esta lição não inclui um desafio de código.

quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Object Oriented Programming