簡體   English   中英

如何制作這個構造函數的深層副本?

[英]How to make a deep copy of this constructor?

我制作了這個構造函數,我需要對它進行深層復制。 我真的不明白深層復制的含義。 我知道它會創建一個具有自己的動態內存的對象的獨立副本,但我不明白需要什么。 我也不確定如何實際實現深拷貝。 有什么建議么?

這是我的構造函數,我需要深入復制:任何人都可以提供一些語法幫助,如骨架?

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;
  }
}

什么是復制和交換習語?

使用深層副本,以便您可以復制對象具有的所有信息,然后在不更改原始文件的情況下更改副本。 從廣義上講,淺拷貝只會復制指針本身,但仍指向相同的信息。 如果您不小心,這可能會導致數據意外更改。

特別是通過Stroustrup的演示幻燈片#14和#15

深層復制:復制指針及其指向的內容,以便現在兩個指針都指向不同的對象

  • 什么向量,字符串等
  • 需要復制構造函數和容器類的復制賦值

基本上,這歸結為: 正確有效安全地管理您的指針。 您可能還想查找關於異常安全類設計異常安全異常安全函數調用復制和交換習慣用法以及Sutter的GOTW文章。

可以從游戲中給出一個例子。 假設你有一個策略游戲,敵人士兵擁有盔甲,健康等個人屬性。假設游戲從文本文件中讀取這些屬性,並在每次創建敵方士兵時分配屬性。 而不是從文本文件中反復讀取所有信息或將文本文件保留在內存中(通常比其對象形式大),具有原型對象池,這些對象是在加載階段從同一文本文件創建的,可能是一個更好的解決方案。 當需要敵方士兵時,您可以通過將其傳遞給新對象的構造函數或工廠模式從原型對象創建它。 在構造函數(或工廠類)中,您肯定需要深層復制並且要小心,創建所有對象而不是為具有單個對象分配指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM