Wynalazek zwany PIMPLPisząc biblioteki w C++ często można natrafić na problem wytworzenia wystarczająco dobrej enkapsulacji. Definicje klas, znajdujące się w plikach nagłówkowych, często pokazują za wiele: wszystkie prywatne pola i metody, które moglibyśmy chcieć ukryć. Dodatkowym problemem jest to, że praktycznie każda zmiana w implementacji wymaga zmiany definicji klasy, a to często przekłada się na konieczność ponownej kompilacji całego projektu.
Okazuje się, że istnieje bardzo proste rozwiązanie tego problemu -- PIMPL (private implementation):
// plik object.h
class ObjectImpl;
class Object
{
ObjectImpl* impl;
public:
Object();
~Object();
int SampleMethod(int x);
};
// plik object.cpp
class ObjectImpl
{
// Właściwa implementacja
};
Object::Object()
{
impl = new ObjectImpl();
}
Object::~Object()
{
delete impl;
}
int Object::SampleMethod(int x)
{
return impl->SampleMethod(x);
}
Oczywiście wypdałoby jeszcze dopisać konstruktor kopiujący i operator przypisania jeśli to konieczne.
Dodatkowo, można zmienić całkowicie implementację, a dla użytkowników klasy wszystko będzie wyglądać dokładnie tak samo. Jako lekturę uzupełniającą polecam to i stary wątek na forum gamedev.pl.