在一个项目中,我有一个类层次结构实现了一个层次结构的图形(也就是说,一个图形节点可以是一个图形本身 - 把它想象成一个电子电路,其中一个门实际上可以是一个集成芯片,实例)。因此,我将一些课程Base
导出到Group
和Leaf
,而课程Base
有一个属性ancestor
,我希望能够从Group
的给定方法(添加子项时)设置,但不能从其他任何地方设置:
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
方法,但在我看来,在这种情况下这是不可能的,因为我必须在Group::setAncestor
中声明朋友Base
,必须在之前声明。 (另请注意,这些声明位于实际代码中的不同文件中。)
答案 0 :(得分:0)
数据成员Base :: ancestor应具有受保护的访问权限。这样它就可用于派生类。
答案 1 :(得分:0)
您可以在Base
和Leaf
类中以及在其他任何地方使用私有继承将其声明为受保护,因此受保护的成员将是私有的。
class Group;
class Base {
protected:
Group* ancestor;
};
class Group : public Base {
private:
void setAncestor(Base* newAncestor) {
// Something like
ancestor = newAncestor->ancestor;
}
};
class Leaf : private Base {
// ...
};
请注意,我将名称从child
更改为newAncestor
。
因此,当您创建一个新孩子时,您可以执行以下操作:
Base ancestor;
Group child;
child->setAncestor(&ancestor)