class A { A(); ~A(); A(const A&); void operator=(const A&); friend class X; }; class X { class Impl; Impl* impl_; };
ユーザから見て A オブジェクトの生成と消去を X からしかできないようにしたいけど impl_ の中で A を何らかのコンテナで管理するとき、そのコンテナは A と friend で はないので A のコンストラクタとデストラクタを呼び出せません。A の中に実装のため のクラスを friend として並べたくないし、実装の変更のたびに変更したくありません。