Я вижу много исходного кода, который использует идиому PImpl в C ++. Я предполагаю, что его цель - скрыть личные данные / тип / реализацию, чтобы убрать зависимость, а затем уменьшить время компиляции и проблему включения заголовка.
Но интерфейсные / чисто абстрактные классы в C ++ также имеют эту возможность, их также можно использовать для сокрытия данных / типа / реализации. И чтобы позволить вызывающей стороне просто видеть интерфейс при создании объекта, мы можем объявить фабричный метод в заголовке интерфейса.
Сравнение:
Стоимость :
Стоимость пути интерфейса ниже, потому что вам даже не нужно повторять реализацию функции общедоступной оболочки
void Bar::doWork() { return m_impl->doWork(); }
, вам просто нужно определить сигнатуру в интерфейсе.Хорошо поняли :
Технология интерфейса лучше понимается каждым разработчиком C ++.
Производительность :
Интерфейс по быстродействию не хуже, чем у PImpl идиома, у обоих дополнительный доступ к памяти. Я предполагаю, что производительность такая же.
Ниже приведен псевдокод для иллюстрации моего вопроса:
// 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;
};
Эту же цель можно реализовать с помощью интерфейса:
// 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();
Так какой смысл Пимпл?
Impl
классе не нарушитABI
, но добавление публичной функции в интерфейсе сломаетABI
.