当我遇到这个问题时,我想到了两个选择。
第一个是在 List 类中声明 Node 结构。就像:
class List
{
private:
struct Node
{
int data;
Node* next;
}
Node* head;
//...
public:
//....
}
对于这个,效果很好。公共(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 的公共(public)区域中的函数更改 Node 中的指针和数据。如果我把data
和next
放在类Node的public
区,恐怕用户也可以直接改指针破坏列表。
人们在实现 List 时通常会做什么?提前感谢您的建议:-)
最佳答案
在库代码开发中,通常将这些类型的“辅助”类(和函数)放在“详细”命名空间中,即,像这样:
namespace my_library {
namespace detail {
class Node
{
public:
int data;
Node* next;
//...
//...
}
}
class List
{
private:
detail::Node* head;
//...
public:
//...
}
}
按照惯例,任何查看或使用您的库的人都应该知道“详细信息”命名空间(或子命名空间)中的任何内容都“对公众消费不安全”,可以这么说。您还可以更进一步,将辅助类放在另一个 header (如“List_detail.h”)中以进一步“隐藏”它们。此外,在生成库的文档时(例如,使用 doxygen),您应该跳过/省略/隐藏“详细信息”命名空间(或子命名空间)中的任何声明。
如果合适(在链接方面),您也可以将它们放在未命名的命名空间中。
嵌套类有时会被法令(在编码指南中)避免,因为它们并不总是被所有编译器(主要是旧的不合标准的编译器)很好地处理。
关于c++ - C++中实现List时在何处声明Node结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22652004/