2012-03-02 12 views
0

これはおそらくテンプレート化されたどのクラスにも一般化することができますが、私はこれをshared_ptrで実行しました。 は、私は次のようになり、クラスのシステムがあります。私のライブラリで、私はユーザーに公開すべきでない関数のセットを使用していますので、私はこの概念を使用してい特殊なshared_ptr変換C++ 0x

class A { 
protected: 
    // some data 
} 

class B : public A { 
    // some access functions 
} 

class C : public A { 
    // some other access functions 
} 

を、ので、私は2つのインターフェイスに、これらの機能を分割しますクラス。今、私は1つのクラスと友人を使うことができると知っていますが、複数のクラスがそれらの関数にアクセスする必要がある場合、これは醜いでしょう。

しかし、私はこれらのクラスがshared_ptrでarroundに渡され、参照カウントを保持する必要があります(データが破壊されるため)。したがって、この例ではshared_ptr<B>からshared_ptr<C>に変換する必要があり、その逆もあります。 shared_ptrは、必要な場合にはそのようなことを許しますか?もしあれば、それは何ですか?コンストラクタ?オペレータを割り当てますか?または、レベルを上げてコンテンツだけでなくポインター全体をキャストする必要がありますか?私は今まで運がなかった。

また、特定の機能を隠すための優れた方法があれば喜んで聞こえますが、この質問にも回答したいと思います。

+0

は、匿名の名前空間を見たことがありますか?内部リンケージ? – ildjarn

+0

私は内部のリンケージを使用してコンテンツのほとんどを隠していますが、B(ライブラリの内部関数をパックしています)を含む第4クラスDを想像してください。他のクラスのヘッダに既に必要な場合は隠すことはできません。私は名前空間のない経験がほとんどないので、おそらくそれについて詳しく見ていきます。 – Raven

+0

私は、この継承のナンセンスの代わりに_を意味しました。 – ildjarn

答えて

5

あなたは<memory>から、std::static_pointer_caststd::dynamic_pointer_castをしたい:

struct A {}; struct B : A {}; 

std::shared_ptr<B> p(std::make_shared<B>()); 
std::shared_ptr<A> q(std::static_pointer_cast<A>(p)); 
// now p and q **share** ownership over their pointed-to object.