基本链表数据结构。
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吗?
这个建议仍然很好。您不应该公开这些字段。相反,您应该:
- 将"LinkedList"声明为"Node"的朋友
- 将"Node"移动到"LinkedList"
(就我个人而言,我建议将"Node"放在"details"或"internal"命名空间中,添加"LinkedList"作为Node的朋友,并创建一个"typedef-details::Node Node"在LinkedList的私有部分中,除非您打算让其他代码使用Node,在这种情况下,您可能还想考虑创建公共访问器函数,以便对字段进行只读访问——在这种特殊情况下,我在LinkedList中仍然有一个指向"Node"的typedef,但在这种情况中,我会将typedef设置为公共)。
这两种方法中的任何一种都将授予LinkedList访问权限,但仅授予LinkedList访问权限。
为了回答你关于公开的危险性的问题,一些危险包括:
- 如果您更改了内部实现的名称或结构,并且它是公开的,那么就有可能破坏依赖这些内部实现详细信息的外部用户
- 您取消了强制执行合理约束或确保对数据结构进行某些假设的能力。例如,公开"next_"将允许代码的恶意(或不称职)用户在不删除节点的情况下取消节点链接,或者在假定为非循环的链表中循环链接节点。一旦您公开了内部数据成员,就可以对其结构和价值做出任何假设