Wynalazek zwany PIMPL

06.04.2009 @ 23:04:34 by Rafał Kozik | programowanie C++

Piszą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.




Komentarze

2009-05-06 @ 17:40:08

Ta technika wykorzystana została w SDK foobar2000 (a właściwie nim samym ;) ).
Komentowanie zostało tymczasowo wyłączone.