2012-06-10 89 views

回答

31

原因#1選擇struct vs class:類有繼承,結構不。如果你需要多態,你必須使用類。

原因#2:結構通常是值類型(儘管如果您在其中工作,可以使它們成爲引用類型)。類總是引用類型。所以,如果你想要一個值類型,選擇一個結構。如果你想要一個參考類型,最簡單的方法就是上課。

理由3:如果你有大量的數據成員的類型,那麼你可能會想引用類型(以避免昂貴的複製),在這種情況下,你可能會選擇一個班級。

原因#4:如果你想確定性地破壞你的類型,那麼它將需要一個堆棧結構。 GC堆上沒有確定性的破壞,GC堆上的破壞者/終結器可能永遠不會運行。如果他們被GC收集,那麼他們的終結者將被運行,但否則,他們不會。所以,如果你希望你的類型在它離開作用域時被自動銷燬,你需要使用一個結構體並將它放在堆棧中。

至於你的具體情況,容器通常應該是參考類型(複製所有元素,每次你通過一個將會非常昂貴),並且是一個容器,所以你會想要使用一個類,除非你想要使它成爲ref-counting結構的麻煩,這肯定是更多的工作。它的優勢在於保證析構函數在不再使用時運行。

另一方面,如果你創建一個容器是一個類,你可能會想要使它成爲最終的,這樣它的各種函數就可以被內聯了(如果該類不會被虛擬化, t衍生自Object以外的任何東西,它們不是Object所具有的功能),這對於性能絕對重要的容器可能很重要。

+0

假設容器類可以存儲節點類型中的所有值:如果將其設置爲結構,則每當刪除節點並且節點本身包含引用值(類的對象)時,該引用是否也會被刪除? 例: List!Object lisObj; ... Object obj = new Object; lisObj.add(obj) lisObj.remove(Obj); //將obj仍然存在? – Fred

+0

只是爲了好奇,關於容器的福博圖書館有多完整?它有什麼和缺少什麼? – Fred

+1

任何與new分配的東西都是垃圾回收。如果你想在堆上的東西在特定的時間被釋放,那麼使用malloc和free來管理它們的內存。至於Phobos的容器,它們在std.container中,而且它們目前相當稀少,因爲自定義分配器的東西仍然在被排除,我們正在等待在寫入所有容器之前完成這些工作,因爲否則在我們添加自定義分配器時會導致重做很多工作。如果內置類型和std.container不夠用,請查看http://www.dsource.org/projects/dcollections –

5

"D"iving Into the D Programming Language

在d你結構,然後你得到的類。他們共享許多設施,但有不同的章程:結構是價值類型,而類是爲動態多態而設計的,並且只能通過引用來訪問。這種混淆,切片相關的錯誤,和評論拉//否!不要繼承!不存在。當你設計一個類型時,你會預先決定它是一個單態值還是多態參考。 C++着名允許定義含糊不清的性別類型,但它們的使用是罕見的,容易出錯的,並且令人反感,足以保證通過設計避免它們。

爲了您Stack類型,你可能是最好的方法是定義其interface先實現(使用class),這樣就不會搭配特定的實現你的Stack類型的接口。

+1

定義一個接口不是必需的,因爲有鴨子打字(帶編譯時檢查)。例如,D範圍可以在沒有接口的情況下使用,並且通常以結構體的形式實現。 –

+0

@ RomanD.Boiko:你是指模板嗎?另外,'interface's有一定的優勢。 – dirkgently

+0

是,約束模板參數。這兩種方法都有其優點,我只是說,使用接口不是必要的,以避免耦合。 –