c++ - 我的复制构造函数失败..如何复制指向对象的指针

标签 c++ copy-constructor

我尝试为指向在类 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/

相关文章:

c++ - 为什么 "copying"复制构造函数中的引用仍然有效?

c++ - OpenCV 中 Mat 对象的 header 是什么意思?

c++ - 为什么 front() 返回的值在 std::queue 的 pop() 之后仍然存在?

c++ - 当我们将指针从一个对象复制到同一类的另一个对象时,我们到底想要什么?

c++ - 可变参数构造函数是否应该隐藏隐式生成的构造函数?

c++ - 如何正确复制给定其 shared_ptr 的对象

android - C++ - 具有类函数引用的模板无法在 Android 上编译

c++ - OpenCV - 套接字接收到失真图像

c++ - 在处理程序中排队请求时,从多个线程或一个线程调用boost asio io_service.run

C++ 复制构造函数清除 Derived* 的 vector<Base*>