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.
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
1Fundamentos da Programação Modular
Arquivos de CabeçalhoInclude GuardsArquivos-FonteFunções EstáticasRecapitulação: Calculadora Modular4Encapsulamento
Conceito de Ponteiros OpacosDefinindo Structs OpacasGetters e SettersValidação em SettersRecapitulação: Caixa Secreta2Objetos e Métodos
Structs como ObjetosO Ponteiro 'Self'Const CorrectnessPonteiro vs ValorMétodos AuxiliaresRecapitulação: Point Manager5Projeto: Conta Bancária Simples
Configuração do ProjetoImplementação da Conta3Ciclo de Vida de Objetos
Padrão de ConstrutorPadrão de DestrutorInicialização na StackCópia ProfundaRecapitulação: String Wrapper6Herança via Composição
Incorporação de StructsA Regra do Primeiro MembroAcessando Membros PaiUpcastingRecapitulação: Hierarquia de Formas9Projeto: Desenhador de Formas
Visão Geral do ProjetoImplementação do Círculo