我有一个由许多子类继承的主类。继承的主类必须至少受到继承保护,以防止非衍生类通过子类使用或改变它。
有没有办法允许各个子类改变彼此继承的主类变量,但不允许公共访问主类?如果不使用friend关键字,这将产生复杂的代码。
完整背景:
我有一个节点类,可以相对于它添加/删除节点。有一个依赖于节点类的列表类(和子类),这意味着节点不能公开访问,以防它也破坏类列表。还必须可以访问节点以列出帮助程序类。
为确保发生这种情况,我在另一个类accessnode中实现了受保护的节点。所有希望节点权限的类都将accessnode继承为protected(因此accessnode类不公开)。这意味着帮助程序和列表类/子类都可以访问节点。
问题是,为了使TemplateList能够通过只读方式复制CharList(TemplateList的子类),它需要访问CharList的节点(以避免使用CharList的迭代器) - 问题是,节点受到保护(防止外部非接入节点干扰),并实现授予节点访问权限的公共方法会破坏这一点。
我需要的是横向继承,因此accessnode类型的所有子类都可以访问彼此的节点,而无需公开授予访问权。
简而言之:
(受保护)AccessNode中的节点 TemplateList:受保护的AccessNode CharList:受保护的AccessNode TemplateList需要访问CharList的AccessNode AccessNode / Node不能公开。
答案 0 :(得分:2)
免责声明:这与这个特定问题完全无关,但更多的是关于引导您解决此问题以及今天其他问题的一般问题。
我认为你在这里咆哮着错误的树。我感觉你提供了对列表内部节点的访问,然后期望节点类型本身保护列表不受粗心的修改(即可能破坏列表不变量的那些)。在这样做的过程中,您正在寻找一个更简单问题的复杂解决方案:不要让用户首先访问节点。
如果你看一下STL提供的关于容器和特定列表的方法,事情会变得简单得多。该列表是根据一些未知的无法访问的节点实现的。这些节点的操作上的访问说明符根本不重要,因为用户无法访问对象本身,因此它们可以是公共的。用户可以通过不同的代理(iterator
,const_iterator
类型)访问列表内容,该代理仅提供那些不会破坏列表状态的操作。
答案 1 :(得分:1)
你总是可以在顶级课程中添加protected
访问者函数,但不要这样做,重新考虑设计可能要好得多。
编辑:具体示例:
class Base
{
protected:
struct State
{
int m1;
char m2;
State(): m1(), m2() {}
};
State state_;
static State& state( Base& o) { return o.state_; }
};
class Derived
: public Base
{
public:
void foo( Base& other )
{
Base::State& baseState = state( other );
// Blah blah.
}
};
int main()
{
Derived o;
// Blah blah.
}
干杯&第h。,
答案 2 :(得分:1)
我不完全确定我理解你所说的“子类[改变]彼此继承的主类变量”。
如果要允许仅通过派生类访问基类成员变量,请创建成员变量protected
。和/或添加protected
访问者函数。
如果希望派生类的不同实例修改基类中保存的共享数据,则可以向基类添加static protected
成员变量。所有实例都将共享相同的成员变量。
如果你澄清了这个问题会有所帮助。