c++ - C++中实现List时在何处声明Node结构

标签 c++ list nodes

当我遇到这个问题时,我想到了两个选择。

第一个是在 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 中的指针和数据。如果我把datanext放在类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/

相关文章:

c++ - Win32 API : User Impersonation technique to run a process as some other user?

c++ - 为什么分配器接口(interface)封装嵌套类的 "list"实现也受益于封装节点?

c# - 创建一个我希望处理的自定义异常是个好主意吗?

c++ - 为什么我会收到这个超出范围的错误

c# - LINQ 按日期将列表拆分为列表

python - 如何在类外使用方法对象(在类中)?

java - 二叉树的节点类。出现堆栈溢出错误

python - 按以下方式划分列表

javascript - 访问 API JSON 响应值

javascript - setState 在 axios fetch 中不起作用