2016-03-20 17 views
2

派生クラスは、内部クラスのフレンドである親クラスの保護された内部クラスのプライベートメソッドにアクセスできますか?このクラスを考慮

外部クラス Matchableは内部クラス Matchの友人であり、このクラスを考慮し
class Matchable 
{ 
    protected: 
    class Match { 
     friend class Matchable; 

     void append(const Match& match) {} 
    }; 

    public: 
    virtual bool match(const Source& source) = 0; 
}; 

...:Literalが由来し

class Literal : public Matchable { 

    bool match(const Source& source) override { 
    Matchable::Match m; 
    Matchable::Match cm; 

    m.append(cm); 

    return true; 
    } 

} 

... Matchable、にMatchable::Matchをインスタンス化できるようですが、プライベートメソッドMatchable::Match::append()を呼び出すことができません。ここでLiteralは "f 「riendliness」はMatchableです。

この動作が期待されている場合、Literalに親内部クラスのプライベートメソッドにアクセスさせる方法がありますMatch

+0

"派生クラスは、内部クラスのフレンドである親クラスの保護された内部クラスのプライベートメソッドにアクセスできますか?" ...それはBrawndoを使用する場合のみ..それは電解質を持っている! – txtechhelp

答えて

2

はい、これは予想される動作です。友情が継承されていないfriend declaration

あなたはMatchableにデリゲートメソッドを提供するかもしれない(あなたの友人の子供が友達ではありません)を参照してください。その後、

class Matchable 
{ 
    protected: 
    class Match { 
     friend class Matchable; 
     void append(const Match& match) {} 
    }; 
    void appendMatch(Match& match, const Match& matched) { 
     match.append(matched); 
    } 

    public: 
    virtual bool match(const Source& source) = 0; 
}; 

class Literal : public Matchable { 

    bool match(const Source& source) override { 
    Matchable::Match m; 
    Matchable::Match cm; 

    appendMatch(m, cm); 

    return true; 
    } 

} 

それ以外の場合はMatch::appendpublic(友人宣言は無意味です)。

+0

さあ、ありがとう!これが事実であることを見て、あなたの提案は一般的に使用されている解決策ですか、あるいは私は友人のクラスをこの方法で乱用していますか?たとえば、達成しようとしていることに対して、まったく異なるアプローチを提案してください。 –

+0

@DecentDabbler 'Match :: append'を' public'メソッドにすることをお勧めします。それを 'private'にし、' friend'を使うと複雑なコードになります。それを '非公開 'にする特別な理由はありますか? – songyuanyao

+0

最終的に 'match'インスタンスを' match() 'メソッドから戻したいので、' public'にしたくないでしょう(将来は 'match()'の第2引数があります)。 'match()'のコンシューマに "不変"にしておきましょう。 –

関連する問題