我正在尝试用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;
}
};
问题是,理想情况下,我应该将Stuct CarPart
保留在我的班级中。但我不想。与此同时,我不希望这一点在外面任何地方都可以实现。
我可以有一些方法,而不在类中创建结构吗?而是创建一个新的类CarPart
,只能从 类ListOfPart
访问?
答案 0 :(得分:3)
嗯,作为第一个建议,你考虑过使用std::list吗?它可以省去实现自己的链表语义的麻烦。除非您正在为学习体验编写链接列表(这可能很有价值),否则我建议使用:
struct CarPart
{
int partNumber;
std::string partName;
double unitPrice;
};
std::list<CarPart> ListOfParts;
您还会注意到我正在使用std::string文字,我建议您使用(除非您有充分的理由不这样做)。
对于手头的问题:你可以声明CarPart私有的构造函数,然后将ListOfParts声明为友元类,这是一种方式。但请考虑一下:如果不允许在零件清单外部构建汽车零件,您会获得什么?我看不出你有什么收获。实际上,通过使用朋友,您会在代码结构中引入不必要的复杂性 - 因为使用可怕的'friend'关键字通常会这样做。无论如何,如果你确实想使用friend类方法,你会写:
class ListOfParts;
struct CarPart
{
friend class ListOfParts;
int partNumber;
char partName[40];
double unitPrice;
CarPart* Next;
private:
CarPart()
{
// Do nothing.
}
};
这意味着只有ListOfparts可以调用列表CarPart的默认构造函数。 让我说清楚:这是一个令人憎恶的解决方案,因为它打破了封装规则。但是,像可变一样,朋友可以使用(而且不是这样)。
答案 1 :(得分:0)
你问的是矛盾的。您希望从外部访问CarPart
(在这种情况下,您将其声明为单独的类或公共成员),或者您不希望它可访问(在这种情况下,您将其声明为私有成员)
考虑让您的类更通用:不要让它成为CarPart
的链接列表,而是将其作为一个类模板,创建一个Node
的链表,每个都有{ {1}}。如果你被允许,你应该使用T
,但如果你必须/真的想要,你可以写自己的。
此外,类和结构基本相同;唯一的区别是类成员和继承默认是私有的,而struct成员和继承默认是public。 (但关键字并不总是可以互换的。)
答案 2 :(得分:0)
您可以将CarPart结构移动到单独的标头中,并且仅在ListOfParts实现部分中包含此标头(是的,您需要将定义与实现分开)。
不要忘记前瞻声明
struct CarPart
在定义
之前class ListOfParts