プロジェクトでは、階層レベルを持つグラフを実装するクラス階層があります(グラフノードはグラフ自体になります。例えばゲートが実際に集積チップになることができる回路)。したがって、私はいくつかのクラスBase
をGroup
とLeaf
に派生させ、クラスBase
はGroup
(子供を追加する)の所与のメソッドから設定することができますが、ほかの場所からは設定できないようにするためにはancestor
という属性を持っています:特定の派生クラスの基底クラスメンバへのアクセスを許可する
class Group;
class Base {
private: // or protected?
Group* ancestor;
};
class Group : public Base {
private:
void setAncestor(Base* child) {
// Something like
child->ancestor = this;
}
};
class Leaf : public Base {
// ...
};
これを達成するには "正しい"方法はありますか?通常、私はfriend
メソッドを使用しますが、このコンテキストでは不可能であると私には思われます。Base
に友人Group::setAncestor
を宣言しなければならないので、前に宣言する必要があります。 (これらの宣言は実際のコードでは異なるファイルにあります)。
これはancestor'が公開されていない限り、 '動作しません。 'Group'は、それ自身の*基本クラスの保護されたメンバーにアクセスできます。これは 'Leaf'のような無関係のクラスの基底であるかもしれないので、' Base'ポインタを通して保護されたメンバにアクセスすることはできません。 –
クラス全体を友人にすることができます。つまり、 'friend class Group;'です。 – songyuanyao
フォワード宣言と 'friend'を使うことができます。 – Raito