2015-09-25 47 views
1

我有一個名爲'list'的類的頭文件和一個名爲'node'的類,該類的私有部分內。總之,這個類和結構將構成一個雙線性鏈接的釀酒廠對象列表(釀酒廠是它自己的類)。我想知道是,如果這將是最好的實現和列表構造函數和析構函數 (像這樣的例子,其中全中,編譯器錯誤)中去實現節點結構的變量:我應該在其包含的類的構造函數中初始化一個結構變量嗎?

list::list() 
{ 
    struct node 
    { 
     item = winery::winery() 
     nextByName = nullptr; 
     nextByRating = nullptr; 
    }; 
    headByName = nullptr; 
    headByRating = nullptr; 
} 
list::~list() 
{ 
    struct node 
    { 
     delete item; 
     delete nextByName; 
     delete nextByRating; 
    }; 
    delete headByName; 
    delete headByRating; 
} 

我的編譯器當我刪除列表構造函數和解構器中的那些節點時拋出錯誤;所以上面的例子在某些方面顯然是不正確的。但是在我看來,如果沒有這種方法,這個解決方案就可以工作,只是沒有這個確切的代碼。

我也好奇,如果這將是更好地執行和去實現單獨的結構 (像這樣):

list::node::node() 
{ 
    item = winery::winery() 
    nextByName = nullptr; 
    nextByRating = nullptr; 
} 
list::node::~node() 
{ 
    delete item; 
    delete nextByName; 
    delete nextByRating; 
} 

當我單獨(上面)刪除那些元素,我只構造函數拋出該錯誤爲delete item;。你知道這是爲什麼嗎?你能解釋爲什麼我不需要刪除釀酒廠的物品嗎?我應該在那裏打電話給酒廠解構師嗎?

我應該做一些完全不同的事情嗎?我在網上看過,在我的教科書裏,但是對此沒有明確的答案。我非常感謝你們的幫助,如果你能解釋爲什麼你的解決方案是最好的(如果它是最好的),我會非常感激。畢竟,我幾個月前纔開始學習C++。

順便說一句,這是我的list.h文件看起來像:

#include "winery.h" 

class list 
{ 
public: 
    list(); 
    ~list(); 
    void addWinery(); 
    void removeWinery(); 
    void displayByRating() const; 
    void displayByName() const; 
    void searchByName() const; 
private: 
    struct node 
    { 
     winery item; 
     node * nextByName; 
     node * nextByRating; 
    }; 
    node * headByName; 
    node * headByRating; 
}; 
+0

將'struct node {'放在一個函數中聲明一個名爲'node'的類,該函數是本地函數。看起來好像你認爲它引用了一個不同的結構節點,或者其他東西。 –

+0

紅色警戒,零/三/五違規規則;請考慮複製/移動/分配請 –

回答

0

要初始化,你可以這樣做:

class list 
{ 
public: 
    list(); 
    // etc. 
private: 
    struct node 
    { 
     winery item; 
     node * nextByName = nullptr; 
     node * nextByRating = nullptr; 
    }; 
    node * headByName = nullptr; 
    node * headByRating = nullptr; 
}; 

然後你不需要構造函數採取進一步行動。

雖然你的析構函數是可疑的。如果每個node *應該擁有它指向的對象,則使用std::unique_ptr<node>而不是node *。如果不是那麼delete不是正確的解決方案。

+0

有人發表了這個評論我的問題,我想他們刪除它,但:「你需要了解'new'和'delete'實際上做什麼之前寫任何代碼。第一條規則是永遠不會'刪除'''還沒有被'new'創建的東西,任何編譯器會給你關於上述代碼的長長的錯誤列表也會警告你。你知道他們的意思嗎? – Larrimus

+0

@Larrimus是的,你似乎只是在你的析構函數中寫'delete'而不理解你在做什麼或者爲什麼 –

+0

據我所知,刪除是針對指針的。在那種情況下,我應該如何處理釀酒廠項目?我應該在那裏打電話給釀酒廠的析構者嗎?如果我在一個類中有一個'int myint',是否調用'delete&myint'實用或合適? – Larrimus

相關問題