2014-03-26 45 views
0

當我遇到這個問題時,我想出了兩個選擇。在C++中實現List時聲明Node結構的地方

第一個是聲明List類中的Node結構。這就像:

class List 
{ 
    private: 
      struct Node 
      { 
       int data; 
       Node* next; 
      } 
      Node* head; 
      //... 
    public: 
      //.... 
} 

對於這一個,它的工作好。公共區域中的函數可以利用Node結構中的所有元素進行插入,刪除等操作。另外,這樣可以防止用戶直接使用Node結構(我認爲如果我們在List中聲明Node,其他人不能使用這個結構,這是真的嗎?)。但是,如果這個節點非常一般,並且也會被堆棧,隊列等使用,我們必須每次都聲明它。這很不方便。另外,如果我想實現一些在List上工作的算法(例如排序),是否可以在沒有使用Node結構的情況下執行此操作?

第二個選擇是實現一個節點類:

class Node 
{ 
    private: 
      int data; 
      Node* next; 
      //... 
    public: 
      //... 
} 

class List 
{ 
    private: 
      Node* head; 
      //... 
    public: 
      //... 
} 

此一不工作,因爲我不能在類List的公共區域與功能改變指針和數據節點。如果我把datanext放在public區的Node類,恐怕用戶還可以直接改變指針並銷燬列表。

人們在實施清單時通常會做什麼?感謝您的建議:-)

+2

他們這樣做既不是因爲他們不推倒重來。他們使用'std :: list <>',甚至沒有選擇'std :: vector <>'或'std :: deque <>'。也就是說,除非必須將節點公開爲外部實體,或者將它與其他類共享爲* their *「node」類型,否則沒有理由使其成爲獨立單元。 – WhozCraig

回答

1

正是在庫中的代碼開發傳統的把那些形形色色的「幫手」類(和功能)在「細節」的命名空間,即是這樣的:

namespace my_library { 

namespace detail { 

class Node 
{ 
    public: 
      int data; 
      Node* next; 
      //... 

      //... 
} 

} 

class List 
{ 
    private: 
      detail::Node* head; 
      //... 
    public: 
      //... 
} 

} 

按照慣例,任何人都希望或使用你的圖書館應該知道「詳細」命名空間(或子命名空間)中的任何內容「對公共消費都不安全」,可以這麼說。你也可以更進一步,將輔助類放在另一個頭中(如「List_detail.h」)以進一步「隱藏」它們。另外,在生成庫文檔時(例如,使用doxygen),您應該跳過/忽略/隱藏「詳細信息」名稱空間(或子名稱空間)中的任何聲明。

如果合適(就鏈接而言),也可以將它們放置在未命名的名稱空間中。

嵌套類是由法令有時避免(在編碼準則),因爲他們並不總是很好地所有的編譯器(主要是舊的不符合標準的編譯器)來處理。

0

我的建議是使Node私人,嵌套structList開始。如果需要重新使用它,您可以將其移動到List之外。那時你必須公開Node的數據或提供公開獲取和設置數據的方法。

0

你可以把你的節點類單獨的頭文件node.h

class Node 
{ 
    private: 
      int data; 
      Node* next; 
    friend class List; 
    friend class Stack; 
    friend class Queue;   
    public: 
      Node(int num):data(num), next(NULL) 
      { 
      } 
      int getData() 
      { 
       return data; 
      } 
}; 


#include <node.h> 

class List 
{ 
    private: 
      Node* head; 
    public: 
};