如何制作这个构造函数的深层副本?

时间:2012-05-20 21:31:41

标签: c++ copy-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;
  }
}

3 个答案:

答案 0 :(得分:4)

What is the copy-and-swap idiom?

使用深层副本,以便您可以复制对象具有的所有信息,然后在不更改原始文件的情况下更改副本。从广义上讲,浅拷贝只会复制指针本身,但仍指向相同的信息。如果您不小心,这可能会导致数据发生意外变化。

答案 1 :(得分:3)

仔细阅读Stroustrup的presentation幻灯片#14和#15

  

深层复制:复制指针以及它指向的两个指针   指针现在每个都引用一个不同的对象

     
      
  • 做什么向量,字符串等
  •   
  • 需要复制构造函数和复制   容器类的分配
  •   

基本上,这可以归结为:正确管理指针 安全。您可能还想在copy-and-swapException-safe class designException Safety上查找Exception Safe Function calls成语和Sutter的GOTW文章。

答案 2 :(得分:1)

可以从游戏中给出一个例子。 假设你有一个策略游戏,敌人士兵拥有盔甲,健康等个人属性。假设游戏从文本文件中读取这些属性,并在每次创建敌方士兵时分配属性。而不是从文本文件中反复读取所有信息或将文本文件保留在内存中(通常比其对象形式大),具有原型对象池,这些对象是在加载阶段从同一文本文件创建的,可能是一个更好的解决方案。当需要敌方士兵时,您可以通过将其传递给新对象的构造函数或工厂模式从原型对象创建它。在构造函数(或工厂类)中,您肯定需要深层复制并且要小心,创建所有对象而不是为具有单个对象分配指针。