Salve a tutti, ho dei problemi riguardo il file .cpp che a quanto pare mi crea un loop infinito, forse non ho capito bene come allocare la memoria dinamicamente e l'uso dei distruttori e costruttori, in particolare non mi torna il il getPixel, il costruttore di copia e l'operatore di assegnazione, l'obiettivo dell'esercizio sarebbe proprio di sapersi destreggiare con quest'ultimi, grazie in anticipo a chi risponderà
ecco il testo
-si completi il codice del costruttore BitmapImage facendo in modo che se una delle dimensioni fornite dall'immagine è nulla o negativa allora la dimensione è impostata a 1
-si completi il distruttore per evitare memory teak
-si implementi il metodo getPixel in modo tale che se vengono richiesti pixel al di fuori delle dimensioni dell'immagine si renda un pixel i cui valori RGB sono (-1,-1,-1)
-si implementi costruttore di copia
-si implementi operatore di assegnazione
-si implementi un operatore di uguaglianza
FILE .h
#ifndef BITMAPIMAGE_H_
#define BITMAPIMAGE_H_
#include "RGBPixel.h"
class BitmapImage {
public:
BitmapImage(int w, int h); // TODO check that w and h are >0. Minimum image size is 1x1
BitmapImage(const BitmapImage& bm); // TODO implement a copy constructor
virtual ~BitmapImage(); // TODO avoid memory leaks
void setPixel(int x, int y, const RGBPixel& value);
RGBPixel getPixel(int x, int y) const; // TODO: getting pixels outside of image return a RGBPixel with values (-1, -1, -1)
bool operator==(const BitmapImage& rh); // TODO: implement
BitmapImage& operator=(const BitmapImage& rh); // TODO implement an assignment operator
int getWidth() const {
return width;
}
int getHeight() const {
return height;
}
protected:
int width, height;
RGBPixel* bitmap;
};
#endif /* BITMAPIMAGE_H_ */
FILE .cpp
#include "BitmapImage.h"
BitmapImage::BitmapImage(int w, int h) : width(w), height(h) {
// TODO check that w and h are >0. Minimum image size is 1x1
if(w <= 0 && h <= 0) {
width = 1;
height = 1;
}
bitmap = new RGBPixel[width * height];
}
BitmapImage::~BitmapImage() {
// TODO avoid memory leaks
if(bitmap != nullptr)
delete[] bitmap;
}
// TODO implement a copy constructor
BitmapImage::BitmapImage(const BitmapImage& bm) {
//shallow copy
width = bm.width;
height = bm.height;
//deep copy
if(bm.bitmap != nullptr){
bitmap = new RGBPixel(*bm.bitmap);
for (int i = 0; i < width * height; i++)
bitmap[i] = bm.bitmap[i];
}
else
bitmap = nullptr;
}
void BitmapImage::setPixel(int x, int y, const RGBPixel& value) {
if ((x >= 0) && (x < width) && (y >= 0) && (y < height))
bitmap[x + y * width] = value;
}
RGBPixel BitmapImage::getPixel(int x, int y) const {
// TODO: getting pixels outside of image return a RGBPixel with values (-1, -1, -1)
if ((x >= 0) && (x < width) && (y >= 0) && (y < height))
return bitmap[x + y * width];
else
return RGBPixel(-1,-1,-1);
}
// TODO implement an equality operator
bool BitmapImage::operator==(const BitmapImage& rh) {
if(width != rh.width)
return false;
if(height != rh.height)
return false;
//devo controllare anche tutto l'array bitmap
for(int i = 0; i < width*height; i++)
if(bitmap[i] != rh.bitmap[i])
return false;
return true;
}
// TODO implement an assignment operator
BitmapImage& BitmapImage::operator=(const BitmapImage& rh) {
if(this != &rh){
if(bitmap != nullptr)
delete []bitmap;
width = rh.width;
height = rh.height;
if(rh.bitmap != nullptr) {
bitmap = new RGBPixel(*rh.bitmap);
for (int i = 0; i < width * height; i++)
bitmap[i] = rh.bitmap[i];
}
else
bitmap = nullptr;
}
return *this;
}