C++のpimplとは何か。
pimplはコーディングテクニックのひとつで、ヘッダファイルから本来公開すべきではない項目を隠すことができるようになる。
#include "ClassTest.h" //エントリーポイント int _tmain(int argc, _TCHAR* argv[]) { CClassTest test; test.Set(100); test.Show(); getchar(); return 0; }
class CClassTest { private: class CClassTest_Impl* p_private;//CClassTestメンバはポインタのみ public: CClassTest(void); ~CClassTest(void); void Show()const; void Set(int val); };
#include "stdafx.h" #include "ClassTest.h" //公開したくない変数や関数をここに置く//////////////////// class CClassTest_Impl{ public: int m_value; }; //公開したいメンバ関数の実装///////////////////////////////////// CClassTest::CClassTest(void) { p_private = new CClassTest_Impl; } CClassTest::~CClassTest(void) { delete p_private; } void CClassTest::Show()const{ printf("%d\n",p_private->m_value); } void CClassTest::Set(int val){ p_private->m_value = val; }
①ヘッダファイルは普通cppファイルに#includeされる形で用いられる。
②#includeはファイルの内容をコピーするプリプロセッサである。
③つまり、CClassTest_ImplクラスをClassTest.hに書いても、ClassTest.cppに書いても、コンパイルの段階では全てClassTest.cppに書いたことになる。
④ならば最初からClassTest.cppに書いてしまえば、CClassTest_Implはcppファイルの中だけで完結する
⑤勿論、CClassTest_Implが他のファイルからも参照されるクラスならヘッダファイルに書かなければならない。
⑥しかし、CClassTest_ImplはCClassTestからしか用いない。従ってヘッダファイルで宣言を公開しておく必要がない。
⑦ClassTest.hではCClassTest_Implのポインタのみを宣言する。ポインタはsizeof(void*)長の変数であり、宣言時にクラスの内容がわからなくてもいい。
⑧こうして、ヘッダファイルから公開したくない項目をすべて隠すことが可能となる