【发布时间】:2014-03-26 05:09:54
【问题描述】:
当我遇到这个问题时,我想出了两个选择。
第一个是在 List 类中声明 Node 结构。就像:
class List
{
private:
struct Node
{
int data;
Node* next;
}
Node* head;
//...
public:
//....
}
对于这个,效果很好。公共区域的功能可以利用Node结构中的所有元素进行插入、删除等操作。另外,这会阻止用户直接使用 Node 结构(我认为如果我们在 List 中声明 Node,其他人无法使用此结构。是真的吗?)。但是,如果这个 Node 很通用,也会被 Stack、Queue 等使用,我们每次都要声明它。这很不方便。另外,如果我想实现一些适用于 List 的算法(例如排序),是否可以在不使用 Node 结构的情况下做到这一点?
第二种选择是实现一个Node类:
class Node
{
private:
int data;
Node* next;
//...
public:
//...
}
class List
{
private:
Node* head;
//...
public:
//...
}
这个不起作用,因为我无法使用类 List 的公共区域中的函数更改 Node 中的指针和数据。如果我把data和next放在类Node的public区域,恐怕用户也可以直接改指针,销毁链表。
人们在实现 List 时通常会做什么?提前感谢您的建议:-)
【问题讨论】:
-
他们两者都不做,因为他们没有重新发明*。他们使用
std::list<>,通常甚至不使用std::vector<>或std::deque<>。也就是说,除非您必须将节点公开为外部实体或将其作为它们的“节点”类型与其他类共享,否则几乎没有理由使其独立。