gpt4 book ai didi

c++ - 如何使用 C 风格在 C++ 中正确深度复制抽象类数组的二维数组

转载 作者:行者123 更新时间:2023-11-30 20:22:56 27 4
gpt4 key购买 nike

我有抽象类Figure。然后我有一个数组,我想调整它的大小,但不知道该怎么做。

Figure ** arr; //lets assume it's filled with some data
Figure ** temp = new Figure * [size + 1];
for(int i =0; i < size; ++i)
{
temp[i] = new Figure(); //it doesn't let me to create object from the abstract class
temp[i] = arr[i] //if I do this, once I delete arr, I will lose temp as well
}

有什么帮助吗?

最佳答案

问题

如果Figure是一个抽象类,你不能实例化它:

temp[i] = new Figure();  // ouch:  can't do: strictly forbidden

即使你可以,你也无法在不遭受slicing的情况下复制这样的多态类。 :

temp[i] = arr[i];        // arr[i] is a derivate of Figure and might have a different size for example 

解决方案

要解决您的问题,您必须定义一个虚拟 clone()成员函数:

class Figure {
...
Figure* clone() = 0;
};

然后您将实现此功能,例如如下所示:

class Square : public Figure {
...
Figure* clone() override {
return new Square(*this);
}
};

您可以将深层拷贝更改为:

temp[i] = arr[i].clone(); 

改进

返回新分配的克隆的风险是内存泄漏。所以您可以使用 shared_ptr<Figure> 而不是使用原始指针或unique_ptr<Figure> (不仅作为克隆函数的返回参数,还作为数组的元素。

顺便说一句,您还可以考虑将数组更改为 vector ,从而避免临时的额外手动内存分配(以及稍后的删除)。

关于c++ - 如何使用 C 风格在 C++ 中正确深度复制抽象类数组的二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37901608/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com