我有这个功能,我无法修改它
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;
}
答案 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
。