Ocultar a implementação com PIMPL
Oculte detalhes de implementação por trás do padrão ponteiro para implementação
Ocultar a implementação com PIMPL é uma aula grátis de C++ Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C++ Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C++ Academy inclui 4 aulas no total.
O idioma PIMPL
PIMPL = "Ponteiro para a implementação". Mova os dados privados da classe para uma estrutura impl separada, acessada por meio de um ponteiro.
Por que usar PIMPL?
Benefícios:
- Ocultar os detalhes da implementação dos cabeçalhos
- Reduzir as dependências em tempo de compilação
- Manter a estabilidade da ABI ao adicionar membros privados
- Permitir a substituição das implementações
Estrutura básica
A classe pública contém um ponteiro para uma estrutura Impl definida somente no arquivo .cpp.
// widget.h
class Widget {
public:
Widget();
~Widget();
void doSomething();
private:
struct Impl;
std::unique_ptr<Impl> pimpl_;
};Impl no .cpp
A estrutura Impl contém todos os dados reais.
// widget.cpp
struct Widget::Impl {
std::string name;
int counter;
// ... anything else, freely
};
Widget::Widget()
: pimpl_(std::make_unique<Impl>()) {}
Widget::~Widget() = default; // must be in .cpp where Impl is complete
void Widget::doSomething() {
pimpl_->counter++;
}Destrutor no cpp
O destrutor deve ser definido no .cpp, onde Impl está completo. Caso contrário, unique_ptr não poderá excluir um tipo incompleto.
Funções-membro especiais
A cópia, a movimentação e a atribuição também devem ser declaradas explicitamente quando necessário. As versões geradas pelo compilador não podem funcionar com um tipo incompleto no cabeçalho.
// widget.h
class Widget {
public:
Widget(const Widget& other);
Widget& operator=(const Widget& other);
Widget(Widget&&) noexcept;
Widget& operator=(Widget&&) noexcept;
~Widget();
};Custo de desempenho
O PIMPL adiciona uma indireção a cada acesso a um membro e uma alocação no heap. Para métodos chamados com frequência, isso pode ser relevante — faça medições para ter certeza.
Compilações mais rápidas
Cabeçalhos que antes incluíam tipos da biblioteca padrão ou dependências pesadas agora podem ser enxutos. Altere o .cpp sem recompilar os consumidores.
PIMPL com herança
Pode ser combinado com herança, mas acrescenta complexidade. Normalmente, a classe pública não deriva de nada; a Impl pode usar herança livremente.
Variações
Alternativas e aprimoramentos:
- PIMPL rápido — armazenamento inline com new de posicionamento
- Endereço estável — a Impl permanece alocada durante o tempo de vida do objeto
- Apagamento de tipo — a Impl pode ser polimórfica
Uso no mundo real
O PIMPL é amplamente usado por:
- Qt (cada Widget usa PIMPL)
- Muitas bibliotecas proprietárias
- Boost (em alguns pontos)
Quando usar
Use PIMPL quando:
- Quiser estabilidade da ABI entre versões
- Seus cabeçalhos incluírem transitivamente conteúdo demais
- Você expuser uma API de biblioteca pública
Quando evitar
Evite PIMPL quando:
- A classe for interna — nenhum consumidor dependerá do cabeçalho
- A sobrecarga de desempenho for mais importante que os tempos de compilação
- A classe for pequena ou raramente modificada
Verificação rápida
Por que o destrutor de uma classe PIMPL deve ser definido no arquivo .cpp?
Recapitulação
O PIMPL oculta a implementação movendo os dados privados para uma estrutura Impl acessada por meio de unique_ptr. Ele melhora a estabilidade da ABI e os tempos de compilação ao custo de uma indireção. Defina as funções-membro especiais no .cpp onde Impl está completo.
Perguntas Frequentes
A aula “Ocultar a implementação com PIMPL” é grátis?
Sim — o texto completo de “Ocultar a implementação com PIMPL” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C++ Academy, atualize para CoddyKit PRO. O curso de C++ Academy inclui 4 aulas no total.
O que vou aprender em “Ocultar a implementação com PIMPL”?
Oculte detalhes de implementação por trás do padrão ponteiro para implementação Você pratica C++ Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar C++ Academy?
Nenhuma experiência prévia é necessária. C++ Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.
Quanto tempo leva a aula “Ocultar a implementação com PIMPL”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de C++ Academy?
Sim. Cada aula de C++ Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Bibliotecas apenas de cabeçalho versus compiladas
- Versionamento de API e estabilidade de ABI
- Ocultar a implementação com PIMPL
- Escrever uma biblioteca utilitária moderna apenas de cabeçalho