Node类中公共下一个指针的分支

时间:2014-09-19 08:07:51

标签: c++ linked-list nodes

基本链接列表数据结构。

class Node {
public:
    Node();
    Node(int num);

private:
    int data_;
    Node * next_;
};

class LinkedList {
public:
    LinkedList();

    void insertAtFront(int toAdd);
    void insertAtEnd(int num);

private:
    Node * head_;
};


....


void LinkedList::insertAtFront(int toAdd) {
    if (head_ == NULL) {
        head_ = new Node(toAdd);
    }
    else {
        Node * current = head_;
        while (current->next_ != NULL) { //problem in question

        }
    }
}

这显然是一个粗略的,远非完成的实现,所以不要在语法上判断我。但我对我的IDE向我投掷的明显警告提出了疑问。主要是next_是私有的,所以while循环不起作用。 current-> next是无法访问的。

在我的编程课程的早期,我已经打败了我,所有类变量都应该在几乎所有情况下都是私有/受保护的。现在我可以走明显路线,在Node类本身中添加一个递归函数来处理插入并从head_等调用它。

或者,在这里和我在一起,我可以将next_公开?我真的不明白为什么不。由于main()只能通过私有head_指针间接访问节点,并且节点的实际“数据”是私有的,是否有理由保持next_ private?

1 个答案:

答案 0 :(得分:0)

这个建议仍然很好。您不应该公开这些字段。相反,你应该:

  1. 将“LinkedList”声明为“Node”的朋友
  2. 将“Node”移动到“LinkedList”
  3. (我个人建议将“Node”放在“details”或“internal”命名空间中,将“LinkedList”添加为Node的朋友,并在LinkedList的私有部分创建“typedef details :: Node Node”,除非你打算让其他代码使用Node,在这种情况下你可能还想考虑制作公共访问器函数,这些函数提供对字段的只读访问权限 - 在这种特殊情况下,我仍然会在LinkedList中有一个typedef到“Node” ,在这种情况下,我会将typedef公之于众。)

    这些方法中的任何一种都将授予LinkedList,但只授予LinkedList,访问。

    要回答有关将其公开的危险性的问题,一些危险包括:

    1. 如果您更改了内部实施的名称或结构并且它是公开的,那么您可能会破坏已经依赖这些内部实施细节的外部用户。
    2. 您删除了强制执行合理约束的能力,或确保对数据结构的某些假设。例如,暴露“next_”将允许代码的恶意(或无能)用户取消链接节点而不删除它们,或者在假定不是循环的链表中循环链接节点。一旦您公开内部数据成员,所有关于其结构和价值的假设都将被取消。