我正在尝试用C++实现一个链表。目前,我有以下代码:
using namespace std;
struct CarPart
{
int partNumber;
char partName[40];
double unitPrice;
CarPart* Next;
};
class ListOfParts
{
private:
int size;
CarPart* Head;
public:
ListOfParts():size(0), Head(NULL)
{
}
int Count()
{
return size;
}
};
这里的问题是,理想情况下,我应该将Stutt CarPart
保留在我的班级中。但我不想。同时,我不希望这件事在任何地方都能从外面发生。
我可以有一种方法,不在类中创建结构吗?而是创建一个新的类CarPart
,该类只能从类ListOfPart
访问?s
作为第一个建议,您是否考虑过使用std::list?它将省去实现自己的链表语义的麻烦。除非你正在为学习经验写一个链接列表(这可能很有价值),否则我建议使用:
struct CarPart
{
int partNumber;
std::string partName;
double unitPrice;
};
std::list<CarPart> ListOfParts;
您还会注意到,我使用std::string作为文本,我建议您使用它(除非您有充分的理由不这样做)。
对于手头的问题:您可以将CarPart的构造函数声明为private,然后将ListOfParts声明为友元类,这是一种方法。但考虑一下:如果不允许在零件列表之外构建汽车零件,你会得到什么?我看不出你有什么收获。事实上,使用friends会给代码结构带来不必要的复杂性,就像使用可怕的"friend"关键字一样。无论如何,如果你确实想使用friend类方法,你可以写:
class ListOfParts;
struct CarPart
{
friend class ListOfParts;
int partNumber;
char partName[40];
double unitPrice;
CarPart* Next;
private:
CarPart()
{
// Do nothing.
}
};
这意味着只有ListOfparts可以调用列表CarPart的默认构造函数让我明确一点:这是一个令人憎恶的解决方案,因为它违反了封装规则。但是,就像mutable一样,朋友也有用处(事实并非如此)。
您的要求是矛盾的。要么您希望CarPart
可以从外部访问(在这种情况下,您将其声明为单独的类或公共成员),要么您不希望它可以访问(在那种情况下,将它声明为私有成员)。
考虑让你的类更通用一点:与其让它是CarPart
的链表,不如让它成为一个类模板,它可以生成Node
的链表,每个链表都有一个T
。如果允许的话,你无论如何都应该使用std::list
,但如果你必须/真的想写,你可以自己写。
此外,类和结构基本上是一回事;唯一的区别是类成员和继承在默认情况下是私有的,结构成员和继承默认情况下为公共的。(不过,关键字并不总是可互换的。)
您可以将CarPart结构移动到一个单独的标头中,并仅将此标头包含在ListOfParts实现部分中(是的,您需要将定义与实现分离)。
别忘了远期申报
struct CarPart
在定义之前
class ListOfParts