Conceito de ponteiros opacos
Parte da seção Programação Orientada a Objetos 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 oferece uma técnica poderosa chamada ponteiros opacos para resolver isso. A ideia é simples: declarar que uma estrutura existe no cabeçalho, 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 conhece seu tamanho nem seus membros. Isso significa que o código que inclui este cabeçalho só pode trabalhar com ponteiros para Wallet, nunca diretamente com a própria struct.
Por que isso importa? Porque a definição real da estrutura fica oculta no arquivo .c, qualquer código que use seu cabeçalho não pode escrever w->balance nem sizeof(Wallet). É preciso usar as funções que você fornece. Você controla todo o acesso aos dados e pode alterar a estrutura interna mais tarde sem quebrar nenhum código que dependa do seu cabeçalho.
Na próxima lição, você vai praticar a definição do corpo real da struct dentro do arquivo-fonte, completando o padrão de ponteiro opaco.
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 Programação Orientada a Objetos
1Fundamentos da Programação Modular
Arquivos de cabeçalhoProteções de inclusãoArquivos-fonteFunções estáticasRevisão: calculadora modular4Encapsulamento
Conceito de ponteiros opacosDefinindo structs opacasGetters e settersValidação em settersRevisão: caixa secreta2Objetos e métodos
Structs como objetosO ponteiro 'Self'Correção de constPonteiro vs. valorMétodos auxiliaresRevisão: Gerenciador de pontos5Projeto: Conta Bancária Simples
Configuração do ProjetoImplementação da Conta3Ciclo de vida do objeto
Padrão de construtorPadrão de destrutorInicialização da pilhaCópia profundaRevisão: wrapper de String6Herança por composição
Incorporação de structRegra do primeiro membroAcessando membros do tipo paiUpcastingRevisão: hierarquia de formas9Projeto: Desenhador de Formas
Visão geral do projetoImplementação do círculoImplementação do retânguloUso polimórficoContêiner de formasPratique por conta própria: Compilador de C online