难以在C++中实现链表

Difficulty implementing a linked list in C++

本文关键字:实现 链表 C++      更新时间:2023-10-16

我正在尝试用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