Eu vejo muito código-fonte que usa o idioma PImpl em C ++. Suponho que seu objetivo seja ocultar os dados / tipo / implementação privados, para que ele possa remover a dependência e reduzir o tempo de compilação e o problema de inclusão de cabeçalho.
Mas as classes interface / puro-abstrato em C ++ também têm esse recurso, elas também podem ser usadas para ocultar dados / tipo / implementação. E para permitir que o chamador veja apenas a interface ao criar um objeto, podemos declarar um método de fábrica no cabeçalho da interface.
A comparação é:
Custo :
O custo da maneira da interface é menor, porque você nem precisa repetir a implementação da função de wrapper público
void Bar::doWork() { return m_impl->doWork(); }
, basta definir a assinatura na interface.Bem entendido :
A tecnologia de interface é melhor compreendida por todo desenvolvedor de C ++.
Desempenho :
O desempenho da interface não é pior que o idioma PImpl, um acesso extra à memória. Presumo que o desempenho seja o mesmo.
A seguir, está o pseudocódigo para ilustrar minha pergunta:
// Forward declaration can help you avoid include BarImpl header, and those included in BarImpl header.
class BarImpl;
class Bar
{
public:
// public functions
void doWork();
private:
// You don't need to compile Bar.cpp after changing the implementation in BarImpl.cpp
BarImpl* m_impl;
};
O mesmo objetivo pode ser implementado usando a interface:
// Bar.h
class IBar
{
public:
virtual ~IBar(){}
// public functions
virtual void doWork() = 0;
};
// to only expose the interface instead of class name to caller
IBar* createObject();
Então, qual é o objetivo do PImpl?
Impl
classe não quebrará oABI
, mas adicionar função pública na interface quebraráABI
.