2012-04-18 3 views
0

privateMemberにはどのようにしてfriendがなくても、どの派生クラスでも到達できますか?フレンドシップ:同じ親からの多くのクラス

class parent{...}; //a virtual class 

class A: public parent{...}; 
class B: public parent{...}; 
class C: public parent{...}; 
class D: public parent{...}; 
class E: public parent{...}; 
... 
//each has a function, that want access to privateMember 

class MyClass{ 
    int privateMember; 

    friend parent; 
    //I know it doesnt't work, but this shows the best what I want 
} 

答えて

3

あるとして(friend class parentで)それを残すとparentにアクセサ関数を追加BAことを、...使用されます。それは保護されるので、階層外の機能はそれを使用できません。

class parent { 
protected: 
    static int& getPrivate(MyClass & c) { return c.privateMember; } 
... 
}; 

フレンドシップは派生クラスに拡張されないため、これを行う必要があります。

+0

問題の説明と一致するように、少し修正しました。 –

+0

私はそれを得た、私はそれが動作すると思う。 私は簡単な方法があると思っていました。私はセッターとゲッタの機能なしでそれを行うことができます。私はC++がデフォルトでそれをサポートしていない理由がとてもうれしいです。 しかしそれは何もないよりはるかに優れています。おかげさまで – deeagle

0

あなたはprivateMemberを返すgetter関数を、作成することができます。

int getPrivateMember() const { return privateMEmber; }

これは当然の公開方法でなければなりません。

0

ここでの簡単な答えは、他のクラスの内部状態に迷惑をかけないことです。代わりに、パブリックAPIを使用します。こうすることで、自分自身を実装にロックすることを心配する必要がなくなり、変数を変更したときに不注意にクラスの不変条件を破り、さまざまな潜在的な問題を回避できます。

関連する問題