0

我尝试为我的指向对象的指针向量编写一个复制构造函数,该对象在类 Shop 中初始化和声明。考虑的向量是:

std::vector <gCustomer*>   vCustomer;

它也在 gShop 的构造函数中声明并通过析构函数中的循环删除。

现在我想在复制构造函数中有一个指针向量的深层副本。但是实际上没有复制任何内容,如果我设法运行程序并访问 vCustomer,对其大小的检查仍然为零或使程序崩溃。(请注意,如果我将复制构造函数排除在外,以便使用默认的复制构造函数,则程序运行正常)

gShop::gShop(const gShop & cShop)
    {
    for(int i = 0; i < (int)vCustomer.size(); ++i)
        {
        vCustomer[i]  = cShop.vCustomer[i];
        }
    }

谢谢

注意我也有一个分配的操作员

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];
        }
    }
4

3 回答 3

1

循环

gShop::gShop(const gShop & cShop)
    {
    for(int i = 0; i < (int)vCustomer.size(); ++i)
        {
        vCustomer[i]  = cShop.vCustomer[i];
        }
    }

使用错误的限制。它应该从 0 到现有对象的长度:

i < (int)cShop.vCustomer.size()
于 2013-10-12T06:26:22.067 回答
1

您错误地实现了复制构造函数和赋值运算符,它们执行的是浅拷贝而不是深拷贝,并且它们不会调整目标向量的大小。这是一个深拷贝构造函数

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;
}

基本上问题在于您正在复制指针而不是分配新内存。如果你想要一个深拷贝,你必须分配新的内存。

当然还有一个更大的问题,你为什么要使用指针向量。向量的一大优点是您不再需要显式管理内存,通过使用指针向量您失去了这种好处。我不知道你的程序,但在我看来这std::vector<gCustomer>会比std::vector<gCustomer*>. 由于std::vector<gCustomer>您不需要编写复制构造函数或赋值运算符,深复制将自动发生(假设gCustomer进行深复制)。

于 2013-10-12T07:05:37.120 回答
-1

std::vector<> 本身具有复制构造函数来执行深层复制。因此,编译器提供的复制构造函数将实际完成您想要的工作。如果要自己实现,最好在gShop的构造函数的init列表中。

gShop::gShop(const gShop & cShop):vCustomer(cShop.vCustomer)
{
}

vCustomer 的大小在您的复制 ctor 中始终为零。

我对你的 operator=() 感到困惑。你想要什么?我建议你阅读一些关于 C++ 入门的教科书。

于 2013-10-12T06:43:53.817 回答