> pimpl idiom : Pointer Implementation Idiom. Sınıfın 'private' kısmını gizlemek için kullanabiliriz. Böylelikle bizler 'incomplete-type' kullanabiliriz, başlık dosyasını eklemekten kaçınabiliriz. * Örnek 1, Sade Kullanım //neco.hpp #pragma once #include "istack.h" #include "mint.h" #include "person.h" #include class Neco{ public: void necoFunc(); private: Istack istack; // 'Istack' sınıfının tanımını içeren başlık dosyasını da 'include' etmeliyiz. Mint mint; // 'Mint' sınıfının tanımını içeren başlık dosyasını da 'include' etmeliyiz. Person person; // 'Person' sınıfının tanımını içeren başlık dosyasını da 'include' etmeliyiz. std::string str; // 'string' sınıfının tanımını içeren başlık dosyasını da 'include' etmeliyiz. }; // Yukarıda hem ilgili başlık dosyalarını 'include' etme mecburiyeti içerisindeyiz hem de sınıfımızın // 'private' kısmını da kullanılara gösterdiğimiz için 'implementasyon' hakkında bilgi veriyor olabiliriz. //neco.cpp #include "neco.h" void Neco::necoFunc() { istack.push(12); str.push_back('a'); person.print(); mint += Mint(109); } * Örnek 2, 'raw pointer' kullanarak 'pimpl' idiom: //neco.hpp #pragma once class Neco{ public: Neco(); ~Neco(); void necoFunc(); private: struct pimpl; // 'forwarding declaration' pimpl* mp; }; //neco.cpp #include "neco.h" #include "istack.h" #include "mint.h" #include "person.h" #include struct Neco::pimpl{ Istack istack; Mint mint; Person person; std::string str; }; Neco::Neco() : mp{new pimpl} { } Neco::~Neco() { delete mp; } void Neco::necoFunc() { mp->istack.push(12); mp->str.push_back('a'); mp->person.print(); mp->mint += Mint(109); } // Artık 'dinamik' ömürlü bir nesne hayata getirdiğimiz için bu yaklaşım daha maliyetli. // 'pimpl' sınıfının elemanlarına erişim artık 'pointer' vasıtasıyla gerçekleştiğinden maliyet biraz daha // arttı.