[英]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.