0Pricing
C++ Academy · Aula

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

  1. Bibliotecas apenas de cabeçalho versus compiladas
  2. Versionamento de API e estabilidade de ABI
  3. Ocultar a implementação com PIMPL
  4. Escrever uma biblioteca utilitária moderna apenas de cabeçalho
← Voltar para C++ Academy