我有一个Node节点。此类可以相对于自身添加或删除其他节点。 Node由Class类使用。为了防止在使用过程中直接修改节点(外部,IE不是由适当的类),并导致List类出现问题,节点添加/删除功能要么是受保护的,要么是私有的。这要求List类是Node的朋友。
然而,问题是List类本身是其他子类的模板类,添加原型/为每个子类添加friend关键字显然不是最好的解决方案。
我如何设计Node和List类/子类以便:
这些是否可行,若然,怎么办?
答案 0 :(得分:6)
标准库的std::list
类模板是如何设计列表类的示例,因此不会对客户端代码提供对内部节点等的访问。
没有访问权限,没有不受欢迎的干涉......
但是,一般来说,信任一点是更实际的,不要把它放在肩上以确保其他人的代码是正确的。在C ++中表达所有使用限制是很多工作。开放一点可以节省大量工作 - 所以这是一个权衡。
干杯&第h。,
答案 1 :(得分:2)
我会使Node
成为受保护的List
嵌套类:
class List
{
...
protected:
class Node
{
...
};
};
这样,只有List及其子类可以访问它。 由于它嵌套在它还有助于突出显示两个类之间的函数关系。这可能会照顾你的所有点,除了第三点。List
中,因此list可以访问其私有/受保护的成员和函数。
编辑仔细检查我的事实,似乎在C ++中封闭类不要对嵌套类成员具有特殊的访问权限(看起来这是Java的事情),见here。因此,您需要公开Node
个成员,但我仍然认为这个解决方案鼓励良好的封装。
答案 2 :(得分:1)
我不确定我是否理解相关问题,因此我将提供不同的方法,而不是提供答案:
让list
成为node
的唯一朋友,并确保它提供从list
派生的类型需要作为受保护方法的所有操作。在此方法中,list
类型用作所有派生类型的node
类的代理。
让node
成为list
的受保护内部类型。它是list
的内部且受保护的事实阻止了list
层次结构之外的所有人使用该类型,node
中的所有方法都可以是公共的。< / p>
保持友好和信任:保持设计原样,并在node
公开所有人的一些操作。信任用户的内容并记录构建list
类的不变量,以便用户代码知道不执行哪些操作。
我更喜欢第一个选项,因为它提供了管理节点的责任列表,这是一件好事,至少更好地分担责任......有一点在哪里事情可能出错:list
类,由该类维护自己的不变量。
答案 3 :(得分:0)
作为一个想法,使用Mac的答案:
声明一个名为NodeAccess的类,NodeAccess包含在受保护下声明的Node类(如Mac的答案)。
将节点中的函数声明为public。
class NodeAccess
{
protected:
class Node
{
public:
void Function(){}
};
};
然后,对于每个想要访问节点的类,它们都将NodeAccess作为protected进行继承,授予它们以及所有其他子类对受保护规则集中节点的访问权限,但阻止任何其他类访问节点直接。
class Helper: protected NodeAccess
{
};
class OtherHelper: protected Helper
{
};
//等