从"这个"创建一个副本。指针和更改副本而不影响"这个" C ++

时间:2014-12-22 04:27:57

标签: c++ oop pointers

我有这个功能,我无法修改它

Image z("abc.jpg");
Image g = z.change();

在函数Change中,我需要在不影响z的情况下返回g中的新值。

我的主要问题位于下一个功能

Image Image::change(){
    Image temp = *this;
    ...
    temp.image[i][j] = mean; // here also this->image[i][j] changed to the same value
}

在这个函数中,每当我改变temp时,这都会改变,这不是我想要的

复制构造函数

Image::Image(const Image &obj):imageHeader("Temp")
{
    width = obj.width;
    height = obj.height;
    image = obj.image;
    imageHeader = obj.imageHeader;
}

2 个答案:

答案 0 :(得分:0)

你想要的是深拷贝。您需要为类Image实现复制构造函数。

编辑:您提供的复制构造函数仅复制指向图像数据的指针,而不是复制数据本身(以及其他问题)。这就是你看到这种行为的原因。

此类功能的签名如下所示:

Image(const Image &img) 
{ 
    //copy static members normally and manage data to allocate memory for dynamic members
    width = img.width;
    height = img.height;
    imageHeader = img.imgHeader;
    image = //do something to dynamically allocate the image data here
}

还要注意三个规则的规则,你可能也需要一个析构函数和赋值运算符。

答案 1 :(得分:0)

你拥有什么"应该"工作,但只有你有一个有用的复制构造函数。我们真的需要看看Image里面发生了什么,但我的猜测看起来像是

class Image {
    void* bytesOfPixelData; // maybe a char* or some sort of char[][]
}

设置Image temp = *this时,它只会复制指针。由于指针是共享的,因此共享更改。如果要执行深层复制,带有指针的类需要更多智能复制构造函数。只需复制指针就可以执行浅复制。在这种情况下,您的副本构造函数需要分配另一个数据缓冲区并复制数据。具体细节取决于您的实施,但尚未公布。

另请参阅The Rule of Three(或C ++ 11中的五条规则),以正确设计Image