PIMPL
プライベートメンバをすべて、ヘッダでは宣言だけし、ソースファイルで定義する型へのポインタの背後に隠す手法。コンパイルファイアウォールとも呼ばれる。
これで二つの問題が消える。一つはビルド時間だ。通常、プライベートメンバが変わると、そのクラスをインクルードする全ファイルが再コンパイルになる。触れないはずなのに、である。しかもヘッダは、すべてのメンバ型のヘッダまで取り込まなければならない。もう一つはABIの安定性で、ライブラリ作者がこのパターンを使う理由はこれだ。内部が変わってもオブジェクトのサイズは変わらないので、コンパイル済みのプログラムが新しいバージョンのライブラリでも動き続ける。代償は、オブジェクトごとのヒープ確保と、アクセスのたびの間接参照。誰もが一度ははまる罠もある。デストラクタはヘッダで宣言し、ソースファイルで定義しなければならない。さもないと unique_ptr のデリータが不完全型に対してインスタンス化されてしまう。