当我遇到这个问题时,我想出了两个选择。
第一个是在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中的指针和数据。如果我将data
和next
放在Node类的public
区域中,我担心用户也可以直接更改指针并销毁列表。
人们在实施清单时通常会做些什么?提前感谢您的建议: - )
答案 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:
};