C ++ 'ta PImpl deyimini kullanan bir çok kaynak kod görüyorum. Amacının, özel veri / tip / uygulama gizlemektir, böylece bağımlılığı ortadan kaldırabilir ve daha sonra derleme süresini azaltabilir ve başlık dahil sorunu.
Ancak C ++ 'ta arabirim / saf-soyut sınıfları da bu kabiliyete sahiptir, ayrıca veri / tür / uygulamayı gizlemek için de kullanılabilir. Ve bir nesnenin oluşturulmasında arayanın sadece arayüzü görmesine izin vermek için, arayüzün başlığında bir fabrika metodu ilan edebiliriz.
Karşılaştırma:
Maliyet :
Arayüz yolu maliyeti daha düşüktür, çünkü genel sarmalayıcı işlevi uygulamasını tekrarlamanıza gerek kalmaz
void Bar::doWork() { return m_impl->doWork(); }
, sadece arayüzdeki imzayı tanımlamanız gerekir.İyi anlaşıldı :
Arayüz teknolojisi her C ++ geliştiricisi tarafından daha iyi anlaşılmaktadır.
Performans :
Arayüz yolu performansı PImpl deyiminden daha kötü değil, her ikisi de ekstra bellek erişimi. Performansın aynı olduğunu varsayıyorum.
Sorumu açıklamak için sözde kod:
// 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;
};
Aynı amaç arabirim kullanılarak da uygulanabilir:
// 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();
Peki PImpl'ın amacı nedir?
Impl
kırmayacak sınıfınaABI
fakat kıracak arayüzde kamu işlevi ekleyinABI
.