在C ++中实现List时声明Node结构的位置

时间:2014-03-26 05:09:54

标签: c++ list nodes

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

第一个是在List类中声明Node结构。它就像:

class List
{
    private:
          struct Node
          {
              int data;
              Node* next; 
          }
          Node* head;
          //...
    public:
           //....
}

对于这个,它运作良好。公共区域中的函数可以利用Node结构中的所有元素进行插入,删除等操作。另外,这会阻止用户直接使用Node结构(我想如果我们在List中声明Node,其他人就不能使用这种结构。是真的吗?)。但是,如果此节点非常通用并且也将由Stack,Queue等使用,则我们必须每次都声明它。这很不方便。另外,如果我想实现一些在List上工作的算法(例如sort),是否可以在不使用Node结构的情况下实现这一点?

第二种选择是实现Node类:

class Node
{
    private:
           int data;
           Node* next;
           //...
    public:
           //...
} 

class List
{
    private:
           Node* head;
           //...
    public:
           //...
}

这个不起作用,因为我无法使用类List的公共区域中的函数更改Node中的指针和数据。如果我将datanext放在Node类的public区域中,我担心用户也可以直接更改指针并销毁列表。

人们在实施清单时通常会做些什么?提前感谢您的建议: - )

3 个答案:

答案 0 :(得分:1)

在图书馆代码开发中传统的做法是把那些"帮助"一个"详细信息中的类(和函数)"命名空间,即像这样:

namespace my_library {

namespace detail {

class Node
{
    public:
           int data;
           Node* next;
           //...

           //...
} 

}

class List
{
    private:
           detail::Node* head;
           //...
    public:
           //...
}

}

按照惯例,任何查看或使用您图书馆的人都应该知道"详细信息中的任何内容。命名空间(或子命名空间)对于公共消费来说是不安全的,可以这么说。您还可以更进一步,将帮助程序类放在另一个标题中(例如" List_detail.h")以进一步隐藏"他们。此外,在生成您的图书馆文档(例如,使用doxygen)时,您应该跳过/忽略/隐藏"详细信息中的任何声明。命名空间(或子命名空间)。

如果合适(在链接方面),您也可以将它们放在未命名的命名空间中。

有时通过法令(在编码指南中)避免使用嵌套类,因为并非所有编译器(主要是旧的子标准编译器)都能很好地处理嵌套类。

答案 1 :(得分:0)

我的建议是让Node成为struct中私有的,嵌套的List。如果需要重新使用它,您可以将其移到List之外。那时你必须公开Node的数据,或者提供公开的get和set方法。

答案 2 :(得分:0)

您可以将节点类放在单独的头文件node.h中

class Node
{
    private:
           int data;
           Node* next;
    friend class List;
    friend class Stack; 
    friend class Queue;          
    public:
           Node(int num):data(num), next(NULL)
           {
           }
           int getData()
           {
                return data;
           }
};


#include <node.h>

class List
{
    private:
           Node* head;
    public:
};