Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++复制构造函数:带有指针列表的字段_C++_Copy Constructor - Fatal编程技术网

C++复制构造函数:带有指针列表的字段

C++复制构造函数:带有指针列表的字段,c++,copy-constructor,C++,Copy Constructor,我正在尝试为我的类a创建一个包含类型B指针列表的副本构造函数。我尝试的方法如下: class A { private: list<B*> myList; list<B*>::iterator iter; public: A() { } // Copy constructor A(const A &src) { myList.assign(src.myList.begin(), src.myList.end());

我正在尝试为我的类a创建一个包含类型B指针列表的副本构造函数。我尝试的方法如下:

class A
{
 private:
   list<B*> myList;
   list<B*>::iterator iter;

public:
  A()
  {
   }

 // Copy constructor
 A(const A &src)
  {
    myList.assign(src.myList.begin(), src.myList.end());
  }

A& operator= (const A &src);

 };

A& A::operator= (const A &src)
{
// do the copy
myList.assign(src.myList.begin(), src.myList.end());

// return the existing object
return *this;
}

调用最后一个改变a1的函数后,我注意到a2也改变了。我原以为复制构造函数应该防止这种情况发生,但我不知道我在代码中做错了什么。

您的std::list是指针列表。 复制构造函数执行这些指针的浅层复制。在复制构造函数调用之后,a1和a2都是元素指向相同对象的列表。 如果要避免这种情况,请执行以下任一操作:

只需将对象而不是指针存储在std::list成员或 复制构造函数应该执行深度复制。 将一个指针指定给另一个指针将执行浅复制。简单地说,赋值之后,两个指针都指向同一个对象。您的代码大致如下:

您的std::list是指针列表。 复制构造函数执行这些指针的浅层复制。在复制构造函数调用之后,a1和a2都是元素指向相同对象的列表。 如果要避免这种情况,请执行以下任一操作:

只需将对象而不是指针存储在std::list成员或 复制构造函数应该执行深度复制。 将一个指针指定给另一个指针将执行浅复制。简单地说,赋值之后,两个指针都指向同一个对象。您的代码大致如下:


您当前的复制构造函数实际上相当于复制构造函数,如果您自己没有实现,复制构造函数将自动生成:它复制列表中的所有元素,这些元素都是指针。如果复制列表对象并对原始对象进行更改(如添加或删除元素),这些更改将不会反映在副本中。但是对列表中存储的对象的更改将反映在副本中,因为列表只存储指向它们的指针。如果不希望出现这种行为,则必须在列表中存储实际的B对象:

list<B> mylist;

当然,这意味着B必须是可复制的。

您当前的复制构造函数实际上相当于复制构造函数,如果您自己没有实现,它将自动生成复制构造函数:它复制列表中的所有元素,这些元素都是指针。如果复制列表对象并对原始对象进行更改(如添加或删除元素),这些更改将不会反映在副本中。但是对列表中存储的对象的更改将反映在副本中,因为列表只存储指向它们的指针。如果不希望出现这种行为,则必须在列表中存储实际的B对象:

list<B> mylist;

当然,这意味着B必须是可复制的。

这改变了a1,我注意到a2也改变了。这是否适用于列表中包含的元素?从某种意义上说,即使在另一个对象中,修改一个元素也会修改它?想象一下一个电话簿,里面有镇上每个人的姓名、号码和地址。现在你给你的朋友一份电话簿。这是否意味着他电话簿中的鲍勃·琼斯突然与你电话簿中的鲍勃·琼斯有所不同?是的,一份指针列表的副本就是如此。a1发生了变化,我注意到a2也发生了变化。这是否适用于列表中包含的元素?从某种意义上说,即使在另一个对象中,修改一个元素也会修改它?想象一下一个电话簿,里面有镇上每个人的姓名、号码和地址。现在你给你的朋友一份电话簿。这是否意味着他电话簿中的鲍勃·琼斯突然与你电话簿中的鲍勃·琼斯有所不同?是的,一个指针列表的副本就是这样。我想我理解这一点,但我相信列表的默认副本构造函数是元素的深度副本。现在我明白这是为什么了。那么,有没有办法制作列表的深度副本?@FranXh:分别为每个指向的元素分配内存,创建指向该内存的指针,并将新指针存储在列表中。更简单的方法是简单地将对象存储为元素而不是指针。我想我理解这一点,但我相信list的默认副本构造函数是元素的深层副本。现在我明白这是为什么了。那么,有没有办法制作列表的深度副本?@FranXh:分别为每个指向的元素分配内存,创建指向该内存的指针,并将新指针存储在列表中。更简单的方法是简单地将对象存储为元素,而不是指针。
i = 10
*ptr = 10
*ptr2 = 10
i = 20
*ptr = 20
*ptr2 = 20
list<B> mylist;