繁体   English   中英

用C ++很难实现链表

[英]Difficulty implementing a linked list in C++

我正在尝试在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内。 但我不想。 同时,我不希望任何地方的人都无法做到这一点。

我可以在不创建Class的结构的情况下采取某种方法吗? 而是创建一个只能ListOfPart类访问的新CarPart类。

好吧,作为第一个建议,您考虑过使用std :: list吗? 这样可以省去实现自己的链表语义的麻烦。 除非您为学习经历编写了一个链表(这可能很有价值),否则建议使用:

struct CarPart
{

    int partNumber;
    std::string partName;
    double unitPrice;
};

std::list<CarPart> ListOfParts;

您还会注意到我在对文本使用std :: string ,我建议您使用它(除非您有很好的理由不这样做)。

对于眼前的问题:您可以将CarPart的构造函数声明为私有,然后将ListOfParts声明为朋友类,这是一种方法。 但是考虑一下:通过禁止在零件清单外部构造汽车零件,您会得到什么? 我看不到你有任何收获。 实际上,通过使用Friends,您会在代码结构中引入不必要的复杂性-就像使用可怕的'friend'关键字通常那样。 无论如何,如果您确实想使用friend class方法,则可以编写:

class ListOfParts;
struct CarPart
{
    friend class ListOfParts;

    int partNumber;
    char partName[40];
    double unitPrice;
    CarPart* Next;

private:

    CarPart()
    {
        // Do nothing.
    }
};

这意味着只有ListOfparts可以调用列表CarPart的默认构造函数。 让我非常清楚地说明这一点:这是一个令人讨厌的解决方案,因为它违反了封装规则。 但是,就像易变的一样,朋友也有用(不是吗)。

您要问的是矛盾的。 您希望CarPart可以从外部访问(在这种情况下,您将其声明为单独的类或公共成员),或者不希望其访问(在这种情况下,您将其声明为私有成员)。

考虑使您的类更通用:使它不再是CarPart的链表,而应使其成为一个类模板,该模板使每个Node的链表具有T 如果允许的话,无论如何都应该使用std::list ,但是如果必须/真的想要的话,可以编写自己的代码。

而且,类和结构基本上是同一件事。 唯一的区别是,默认情况下,类成员和继承是私有的,而默认情况下,结构成员和继承是公开的。 (不过,关键字并不总是可以互换的。)

您可以将CarPart结构移动到单独的标头,并且仅将此标头包括在ListOfParts实现部分中(是的,您需要将定义与实现分开)。

而且不要忘记前瞻性声明

struct CarPart

在定义之前

class ListOfParts

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM