如何创建指向对象的指针的复制构造函数(深层复制)?

时间:2012-06-24 20:12:19

标签: c++

如何创建指向对象的动态指针数组的深层副本?我相信这段代码,我只是为指向对象的指针分配新内存,但它们仍指向同一位置。因此,当我更改“复制”图像时,原始图像也会更改,反之亦然。

谢谢!

declatration:

Class Scene
{
public: 
    .
    .
    .
    .
private:
    Image ** sceneImage;
    int * coordinateX;
    int * coordinateY;
    int inputMax;
};
复制构造函数中的

......

 Scene::Scene (const Scene & source)
 {
    inputMax = source.inputMax;
    sceneImage = new Image*[inputMax];
    coordinateX = new int[inputMax];
    coordinateY = new int[inputMax];

    // copy even null indexes, because you can put images on null indexes
    for (int i = 0; i < inputMax; i++)
    {
        sceneImage[i] = source.SceneImage[i];
        coordinateX[i] = source.coordinateX[i];
        coordinateY[i] = source.coordinateY[i];
    }
}

3 个答案:

答案 0 :(得分:4)

立即删除new[]的所有用途。使用std::vector。然后它将为您复制自己。此外,删除拥有指针的所有用法并使用智能指针。

答案 1 :(得分:2)

我建议您使用矢量。对于动态数组而言,它们比指针更优雅,并且会自动复制。

只有在具有语义意义(数组≠指针)时才使用裸指针。这在C ++中很少会出现这种情况。

答案 2 :(得分:1)

向量是一个好主意。但是如果你不能重构所有代码来使用它们:

for (int i = 0; i < inputMax; i++)
{
    sceneImage[i] = new Image( *(source.SceneImage[i] ));
    coordinateX[i] = source.coordinateX[i];
    coordinateY[i] = source.coordinateY[i];
}

稍后您需要删除这些图片。