c++复制构造函数:带有指针列表的字段
C++ copy constructor: field with list of pointers
我试图为我的类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;
}
现在,我的问题是如果我这样做:
A=a1;
//call function that will change a1
A a2(a1);
//call function that will change a1
然后在调用最后一个改变a1的函数之后,我注意到a2也发生了变化。我认为复制构造函数应该防止这种情况发生,但我不知道我在代码中做错了什么。
您的std::list
是一个指针列表。
复制构造函数对这些指针执行浅层复制。在复制构造函数调用之后,a1
和a2
都是元素指向相同对象的列表。
如果您想避免这种情况,可以:
- 在
std::list
成员或 中存储对象而不是指针 - 你的复制构造函数应该执行一个深度复制。
将一个指针赋值给另一个指针执行浅复制。简单地说,赋值之后,两个指针都指向同一个对象。您的代码大致相当于:
#include<iostream>
using namespace std;
int main()
{
int i = 10;
int *ptr = &i;
int *ptr2 = ptr;
std::cout<<"ni = "<<i;
std::cout<<"n*ptr = "<<*ptr;
std::cout<<"n*ptr2 = "<<*ptr2;
*ptr2 = 20;
std::cout<<"ni = "<<i;
std::cout<<"n*ptr = "<<*ptr;
std::cout<<"n*ptr2 = "<<*ptr2;
return 0;
}
输出:i = 10
*ptr = 10
*ptr2 = 10
i = 20
*ptr = 20
*ptr2 = 20
您当前的复制构造函数实际上等同于如果您自己不实现的话将自动生成的复制构造函数:它复制列表的所有元素,即指针。如果复制一个列表对象并对原始对象进行更改(例如添加或删除元素),则这些更改不会反映在副本中。但是对存储在列表中的对象的更改将在副本中反映出来,因为列表只存储指向它们的指针。如果您不想要这种行为,则必须在列表中存储实际的B对象:
list<B> mylist;
当然这意味着B必须是可复制的
相关文章:
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 什么更好?返回对象指针列表?或返回指向对象列表的指针?
- 如何将共享指针列表传递到pybind11中的c++对象
- C++:如何初始化包含具有给定键的指针列表的映射
- 使用继承的指针列表复制构造函数或重载运算符=
- 我应该如何在工厂类中存储弱指针列表?
- Qt单元测试:指针列表上的QCOMPARE函数
- 如何正确释放要配对的指针列表?
- 如何在 c++ 上对指针列表进行排序
- 从地图复制到指针列表
- 我对C 中共享指针列表进行排序的功能未完成类型
- const_iterator引用的指针列表
- 在 c++ 中生成字符串到 std::指针列表的映射
- 访问链表中的结构(带有指向其子实现的指针列表的树)
- 有没有办法使用基于范围的迭代器来迭代对指针列表值的引用?
- 使用迭代器指针 (C++) 从对象指针列表中删除元素
- 无法列出定制类型的指针列表
- 创建指针列表的正确范例是什么
- 如何将指向指针列表的私有指针作为 const 返回
- C++填充指向指针**列表的指针,该列表指向指针地址