我尝试为指向在类 Shop 中初始化和声明的对象的指针 vector 编写一个复制构造函数。考虑的载体是:
std::vector <gCustomer*> vCustomer;
在gShop的构造函数中也声明过,在析构函数中循环删除
现在我想在复制构造函数中对指针 vector 进行深度复制。但是实际上没有任何内容被复制,如果我设法运行程序并访问 vCustomer,对其大小的检查仍然为零或使程序崩溃。 (请注意,如果我离开复制构造函数以便使用默认复制构造函数,程序运行正常)
gShop::gShop(const gShop & cShop)
{
for(int i = 0; i < (int)vCustomer.size(); ++i)
{
vCustomer[i] = cShop.vCustomer[i];
}
}
谢谢
请注意,我还有一个指定的运算符(operator)
gShop gShop::operator=(const gShop & rhs)
{
if (this == &rhs) return *this;
for(int i = 0; i < (int)vCustomer.size(); ++i)
{
delete vcustomer[i];
vCustomer[i] = new gCustomer;
vCustomer[i]= rhs.vCustomer[i];
}
}
最佳答案
您错误地实现了复制构造函数和赋值运算符,它们执行的是浅拷贝而不是深拷贝,并且它们没有调整目标 vector 的大小。这是一个深拷贝复制构造函数
gShop::gShop(const gShop & cShop)
{
for(int i = 0; i < (int)cShop.vCustomer.size(); ++i)
{
if (cShop.vCustomer[i])
vCustomer.push_back(new gCustomer(*cShop.vCustomer[i]));
else
vCustomer.push_back(NULL);
}
}
这是一个深度复制赋值运算符
gShop& gShop::operator=(const gShop & rhs)
{
if (this == &rhs) return *this;
// clear any existing data
for(int i = 0; i < (int)vCustomer.size(); ++i)
delete vcustomer[i];
vcustomer.clear();
// add the new data
for(int i = 0; i < (int)rhs.vCustomer.size(); ++i)
{
if (rhs.vCustomer[i])
vCustomer.push_back(new gCustomer(*rhs.vCustomer[i]));
else
vCustomer.push_back(NULL);
}
return *this;
}
基本上问题在于您复制指针而不是分配新内存。如果你想要一个深拷贝,你必须分配新的内存。
当然还有一个更大的问题,您为什么要使用指针 vector 。 vector 的一大优势是您不再需要显式管理内存,通过使用指针 vector 您已经失去了这一优势。我不知道你会编程,但在我看来 std::vector<gCustomer>
会比 std::vector<gCustomer*>
好.与 std::vector<gCustomer>
您不需要编写复制构造函数或赋值运算符,深复制将自动发生(假设 gCustomer
执行深复制)。
关于c++ - 我的复制构造函数失败..如何复制指向对象的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19331117/