2016-10-23 97 views
-2

1)所以我做了一個有點修改形式的鏈接列表,它具有基於索引的尋址和其他刪除功能。我只是要複製我製作的頭文件...類設計問題(管理內存分配和釋放)

template<class T> 
    class LinkedList 
    { 
     public: 
      LinkedList(); 
     ~LinkedList(); 
      int del_node(); // deletes the Node and element 
      int remove_node(); // deletes the Node only 
      int get_length(); 
      int search_node(T*); // matches the pointer to see if its the same element 
      void add(T*); 
      void clear_list(); // calls deletes on all nodes and all elements 
      bool is_blank(); 
      T& get_at(int);  // operates like a vector get_at 
private: 
     struct Node 
     { 
     T* element; // pointer passed to add(T*) is stored here. 
     Node* next; 
    } 

現在看看我如何在鏈接列表中添加一個對象。我需要在我傳遞形式的

new Object()

當我增加了圖的頂點,這是特別有用的一個對象的指針通過。我剛剛輸入的數據,並從用戶等各個領域,並呼籲

LinkedList graph 
graph.add(new Vertex(arguments)); 

現在有來的情況時,我不得不從LinkedListA一些元素複製到B用於臨時存儲。現在我想在任何操作之後能夠從B中刪除元素。但是,如果我使用delete它會銷燬內部節點並刪除我傳遞給它的指針element指向的對象。所以我創建了一個附加函數remove,它只刪除節點,但不刪除element指向的對象。

所以我想問問它是否可以這樣做,或者在我的列表中是否有設計錯誤,我不應該這樣做?我從圖書館的角度思考這個問題,例如我是否會去圖書館提供這個課程。這是合適還是會混淆人?任何意見,將不勝感激。

請,我不需要任何建議使用替代 函數/類/庫像載體。我正在學習數據結構,我有我自己設計的任何類型的數據結構。

+1

你應該堅持的建議是不要用C++關鍵字命名你的函數/變量/類,比如'delete'。 – StoryTeller

+0

哦,其實我命名它del xDD lemme更正它 –

+0

繼從Story Teller的評論 - 你的頭文件甚至不會編譯,因爲使用語言關鍵字作爲函數名稱。像這樣發佈代碼告訴其他人你剛纔沒有太多想法就把頭部扔在一起,甚至沒有嘗試實現你描述的行爲。你需要比這更努力一點。 – Peter

回答

1

更慣用的方式是有Node::~Node隨時撥打delete element;,但增加一個T* Node::release();。這就是std::unique_ptr所做的。

實現是直截了當:

T* Node::release() 
{ 
    T* tmp = element; 
    element = nullptr; 
    return tmp; 
} 

這樣的Node D'TOR仍然是正確的,但你可以從缺失「拯救」中的數據。

這也是解決我感覺是實施中的一個缺陷的第一步。您可以在LinkedList中實現所有功能,即使是與內部類Node的行爲相關的功能。不要這樣做。給Node一個角色和與該角色相關的界面。有LinkedList通過使用該接口工作。

+0

嗯好吧,我明白你在說什麼。但是,假設我已經創建了一個'LinkedList A'的情況。現在我使用'get_at()'運算符來返回一些特定的元素並將它們存儲在'LinkedList B'中。請注意'get_at()'返回原始對象,所以兩個列表都有相同的對象。所以,如果我打電話刪除元素不會列出一個受到干擾呢? –

+0

@ wandering-warrior,比你使用錯誤的語言,你不想'T&get(int idx)'一個元素。你想'刪除(int idx)'它。 – StoryTeller

+0

對。這意味着我不應該在2個不同的列表中存儲1個對象?即如果我想要列表B中存儲列表A的對象,我應該重新分配內存並複製數據以存儲在列表B中?我對嗎? –

0

設計你的班級時,所有權應該是明確的。 爲此,您可以使用顯式方法名稱,並在您轉移所有權時返回std::unique_ptr。使用明確的方法名稱,您應該能夠刪除您的評論。

template<class T> 
class LinkedList 
{ 
    public: 
     LinkedList(const LinkedList&); 
     LinkedList(LinkedList&&); 
     LinkedList& operator=(const LinkedList&); 
     LinkedList& operator=(LinkedList&&); 
     void free_element(int); // deletes the Node and element 
     std::unique_ptr<T> extract_element(int); // deletes the Node only 
     int get_length() const; 
     void add_element(std::unique_ptr<T>); 
     void absorb_element(T*); 
     void free_all_elements(); // calls deletes on all nodes and all elements 
};