実装にだけ必要な型を隠すには...

どうやるのが定番なんだろうか?

class A
{
public:
  int method1(int arg);
  int method2(int arg);

private:
  B member1;
  C member2;
};

A を利用する人は、B や C を知らなくてもいい。でも、A の method1, method2 の実装には B, C といった型が必要で、それはメンバで保持している。でも、A の利用者に B や C を公開したくない。

案1
A の公開したい要素をインターフェスとして抽象クラスで公開してそっちをみせる。A はそれのコンクリートな実装。
案2
A の private には void *privdata など1つだけ置いておき、private なメンバは this->member1, this->member2 ではなくて、privdata->member1, privdata->member2 でアクセスする。(マクロを使えば void* から具体的なメンバをもった型への変換はきにならないだろう)

案1は、A の利用者が普通に A 型の変数を作成したり new A() するときに不便そうなので、案2かな…。
まあ、別に B や C を絶対に公開したくないってのことでもなくて、B が定義されてるヘッダが超巨大なので A の利用者の include list に入れないで解決できるといいな、って程度なのですが。