2011-04-06 12 views
1

私はクラスAを持っていると私はクラスBを持っていると私はクラスB含まれない継承?

由来多く、多くのクラスを持って、私はこれを達成したい:Bの誘導体は、各Whithout A.の保護された変数へのアクセス権を持っている必要がありますその中にはAのインスタンスが含まれており、多くのメモリが必要です。 だから私は今公衆の継承は良い考えではないと思います。これをどうすれば解決できますか? ありがとう!

答えて

5

friendとアクセサー機能で実行できます。これはAの陰部をオフに滞在する信頼Bを行い - AB間の継承関係がありますしない限り、のみBとサブクラスがAのみ保護されたメンバーにアクセスできるようにする良い方法が表示されません。

class A { 
friend class B; 
protected: 
    int X; 
}; 


class B { 
protected: 
    static int getX(A const & a) { return a.X; } 
}; 

class C : public B { 
public: 
    void foo(A const & a) { int bar = getX(a); } 
}; 
+2

C++:あなたの私のメンバーにあなたのプライベートメンバーへのアクセス権があります... – Mehrdad

+0

私は同じことをしますが、ロジックgetXがBのインスタンスに関係しないので、静的int getXを好きです。 **:これを行うには、最初は悪いデザインのように思える。 – Assambar

+0

@Assambar:そうですね、それはとてもきれいです。 – Erik

0

Aの非公開部分へのアクセス権を持つべきではない

+1

すべては?そして、私がBから派生した新しいクラスを作ったら、それをクラスAの友達のリストに追加する必要がありますか?私はそれを拡張可能にしたい。そして、友人たちはプライベートのためにもアクセスできますが、これは必要ありません。 – nullzero

+2

多くのクラスがAのプライベートメンバーにアクセスできるようにするには、パブリックメンバーかパブリックアクセサを使用する必要があります。いずれにしても、デザインを再考する必要があるという印があります。 – Adam

+0

はい、すべてです。 Bの派生クラスがAの友人であると決めることができれば、情報隠蔽を回避するだろう。一方、Erikの解決策はより良いかもしれません。 – Oswald

0

私はBの子どもたちを理解し、クラスAに関係のないところでは、そのようなとしてAのBの友人から派生したクラスを作成します

AのデータにB子クラスのデータを正しくアクセスするには、Aのパブリックインターフェイスが必要です。そのようなパブリックインターフェイスが適切でない場合、それは悪い設計の何かをしようとしているか、Aのパブリックインターフェイスを改善する必要があるという信号です。

関連する問題