难以在C ++中实现链表

时间:2012-01-14 11:53:19

标签: c++ linked-list

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

3 个答案:

答案 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