2012-05-20 32 views
3

我做了這個構造函數,我需要做一個深層的副本。我不太瞭解深層複製的含義。我知道它使得具有自己的動態內存的對象的獨立副本,但我不明白這是什麼需要。我也不確定如何實際執行深層複製。有什麼建議麼?如何製作此構造函數的深層副本?

這裏是我的構造函數,我需要做的深層副本: 任何人都可以提供一些語法幫助,就像一個骷髏?

template<class t_type> 
inline ALIST<t_type>::ALIST() 
{ 
    t_type value; 
    capacity=10; 
    DB = new t_type[capacity]; 
    count=capacity; 

    cout<<"Enter value: "; 
    cin.clear(); 
    cin>>value; 


    for(int i=0; i<capacity; i++) 
    { 
    DB[i]=value; 
    } 
} 
+3

製作'DB'一個'的std ::矢量',你會得到深層副本是免費的。但是在一個構造函數內部進行控制檯I/O真的是非常可疑的。 –

+2

呃,這是作業。如果我在商業C++中看到過這個,我會跑尖叫,但是。 – pg1989

+0

任何人都可以提供一些語法幫助,就像骨架? – Mike

回答

4

What is the copy-and-swap idiom?

深拷貝被使用,這樣就可以在不改變原有複製所有信息的對象有,然後修改副本。一般來說,淺拷貝只會複製指針本身,但仍指向相同的信息。如果您不小心,這可能會導致數據意外更改。

+3

且不說雙缺失。 –

+0

當然。試圖刪除不存在的東西永遠不會結束,並導致難以發現的錯誤。 – 3Pi

3

經過Stroustrup的presentation幻燈片#14和#15特別

深副本:副本的指針,亦是它指向這樣兩個 指針現在分別是指不同的對象

  • 什麼向量,字符串等做
  • 需要拷貝構造函數和拷貝 分配容器類

基本上,這是什麼歸結爲是這樣的:管理你的指針正確有效安全。你可能也想看看了copy-and-swap成語和Exception-safe class designException SafetyException Safe Function calls薩特GOTW文章。

1

一個例子可以從遊戲中給出。 假設你有一個戰略遊戲,敵人的士兵有單獨的屬性,如鎧甲,衛生等假設遊戲讀取一個文本文件,這些屬性和分配各創建一個敵兵的時間屬性。而不是一次又一次地從文本文件中讀取所有信息,或者將文本文件保存在內存中,而內存中的文本通常大於其對象形式,並且具有原型對象池,這些原型對象是在加載階段從相同的文本文件創建的,可能是更好的解決方案。當需要敵方士兵時,可以通過將原型對象傳遞給新對象的構造函數或工廠模式來創建它。在構造函數(或工廠類)中,您肯定需要深度複製,並且要小心,創建所有對象,而不是分配具有單個對象的指針。

相關問題