簡體   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