更改指针指向的对象,但对象不会改变

Changing object a Pointer points to, but the object wont change

本文关键字:对象 改变 指针      更新时间:2023-10-16

在我的图像类中,我想在传递给图像后要更改它们,并且它们仍然应该更改图片。

int main(int argc, char* argv[]){
  Image theImage(4, 8);//width/height
  Pixel aPixel(2,1);
  Pixel* p = &aPixel;
  theImage.setPixel(p);
  aPixel.setBlue(100);//change the blue (RGB) value of the pixel, but Pixel color doesnt change
  theImage.saveAsPixelMap("/Users/dan/Desktop/test.ppm");
  return 0;
}

我以为像素的颜色会改变,因为想象类有指针时,当指针仍然指向同一像素时,更改了哪种颜色,图像中的像素的颜色不应该更改吗?

这是像素构造函数:

Pixel::Pixel(int tx, int ty){
  red = 255;
  green = 0;
  blue = 0;
  x = tx;
  y = ty;
  hasBeenChanged = false;
}

和setpixel方法

void Image::setPixel(Pixel *aPixel){
  int tX = aPixel->getX();
  int tY = aPixel->getY();
  imageData.at(tY).at(tX)->setRed(aPixel->getRed());//value 0 - 255
  imageData.at(tY).at(tX)->setGreen(aPixel->getGreen());
  imageData.at(tY).at(tX)->setBlue(aPixel->getBlue());  
}

Imagedata看起来像

std::vector< std::vector<Pixel*> > imageData;

和saveaspixelmap方法。

void Image::saveAsPixelMap(char aPath[]){
  std::ofstream myfile;
  myfile.open(aPath);
  myfile << "P3n" << this->getWidth() <<" "<< this->getHeight() <<"n255n";
  std::vector < Pixel* > row;
  for (int y = 0; y < this->getHeight(); y++){
    row = imageData.at(y);
    for (int x = 0; x < this->getWidth(); x++){
        myfile << row.at(x)->getRed() << " ";
        myfile << row.at(x)->getGreen() << " ";
        myfile << row.at(x)->getBlue() << " ";
        std::cout <<"rot: "<< imageData.at(y).at(x)->getRed();
    }
  }
  std::cout << "n Writing File to " << aPath << "n n";
  myfile.close();
}

好吧,这是很多代码,请问我是否需要有关某些内容的更多信息,或者我的问题还不够清楚。任何提示如何解决这一非常感谢的

您实现的概念与您描述的内容不同:

  • 描述的是,Image中的某些东西应该改变
  • 实现的是纯复制语义(从给定的像素中读取并将值放在其他像素上)

您需要返回像素的Image类的某种方法 - 可以更改。

示例:

class Image { 
// ..
Pixel & get_pixel(int x, int y) { /* */ }
}

然后,您可以使用:

更改(之后)
image.get_pixel(2,1).setBlue(100)

setPixel方法应引用指针:

void Image::setPixel(Pixel *& aPixel) { .. }