C ++类设计问题

时间:2011-09-10 11:45:57

标签: c++ subclass

我有一个Node节点。此类可以相对于自身添加或删除其他节点。 Node由Class类使用。为了防止在使用过程中直接修改节点(外部,IE不是由适当的类),并导致List类出现问题,节点添加/删除功能要么是受保护的,要么是私有的。这要求List类是Node的朋友。

然而,问题是List类本身是其他子类的模板类,添加原型/为每个子类添加friend关键字显然不是最好的解决方案。

我如何设计Node和List类/子类以便:

  • Node不能在外部构造,只用特定的类/子类构建?
  • 节点可以构造/删除上面给出的其他节点吗?
  • 节点函数只能访问特定的类(列表,列表子类和列表助手类 - 列表助手类不是列表的子类)?
  • 节点变量(Item)可以在上面公开访问吗?
  • List,list子类和list helper类可以直接修改或间接修改Node的非公共变量吗?

这些是否可行,若然,怎么办?

4 个答案:

答案 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
{

};

//等