Salve ragazzi! avrei una domanda riguardante un codice c++ che utilizza operatori sovracaricati.
Praticamente il programma fa varie operazioni su un file immagine .pgm . Tra le varie operazioni quali apertura da file, copia su file, scrittura su schermo ecc, non funzionano gli operatori - + * .
l'operatore meno dovrebbe restituire un'immagine che è la differenza di due immagini. Quelli + e * devono sommare o moltiplicare uno numero ad ogni cella del vettore data dell'immagine.
Analizzandolo mi è sembrato di capire che il problema sia nel return dell'immagine.
Vi allego il codice :
.h
#ifndef MYIMAGE_H
#define MYIMAGE_H
#include <string>
#include <iostream>
using namespace std;
class myimage
{
string type;
int row, col, maxval;
int * data;
public:
myimage();
myimage(int r, int c);
myimage(string nomefile);
~myimage();
bool open(string nomefile);
bool save(string nomefile);
friend std::ostream& operator<<(std::ostream& os, const myimage &o);
const myimage operator-(const myimage &o)const;
const myimage operator+(const int x)const;
const myimage operator*(const int x)const;
int& operator() (int i, int j);
myimage& operator=(const myimage &o);
};
#endif
.cpp
#include"MYIMAGE.h"
#include <string>
#include <iostream>
#include <fstream>
using namespace std;
myimage::myimage() {data=0;}
myimage::myimage(int r, int c) {
row=r;
col=c;
data=new int [row*col];
}
myimage::myimage(string nomefile=" ") {
open(nomefile);
}
myimage::~myimage() {
delete [] data;
}
bool myimage::open(string nomefile) {
ifstream fin(nomefile);
int i=0;
if (!fin)
{
cout<<"errore apertura file di input"<<endl;
return false;
}
else
{
fin>>type>>row>>col>>maxval;
data=new int [row*col];
while (fin>>data[i] && i<(row*col)) {i++;}
return true;
}
fin.close();
}
bool myimage::save(string nomefile) {
ofstream fout(nomefile);
if (!fout)
{
cout<<"errore apertura file di output"<<endl;
return false;
}
else
{
int count=0;
fout<<type<<endl<<row<<" "<<col<<endl<<maxval<<endl;
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
fout<<data[count]<<" ";
count++;
}
fout<<endl;
}
return true;
}
fout.close();
}
ostream& operator<<(ostream& os, const myimage &o)
{
int count=0;
for(int i=0;i<o.row;i++)
{
for(int j=0;j<o.col;j++)
{
os<<o.data[count]<<" ";
count++;
}
os<<endl;
}
return os;
}
const myimage myimage::operator-(const myimage &o) const
{
myimage tmp(row,col);
for(int i=0; i<row*col;i++)
{
tmp.data[i]=data[i]-o.data[i];
}
return tmp;
}
const myimage myimage::operator+(const int x) const
{
myimage tmp(row,col);
for(int i=0; i<row*col;i++)
{
tmp.data[i]=this->data[i]+x;
}
return tmp;
}
const myimage myimage::operator*(const int x) const
{
myimage tmp(row,col);
for(int i=0; i<row*col;i++)
{
tmp.data[i]=data[i]*x;
}
cout<<"oooo";
return tmp;
}
int& myimage::operator()(int i, int j)
{
return data[i*col+j];
}
myimage& myimage::operator=(const myimage &o)
{
type=o.type;
row=o.row;
col=o.col;
maxval=o.maxval;
delete [] data;
data= new int[o.row*o.col];
for(int i=0; i<row*col;i++)
{
data[i]=o.data[i];
}
return *this;
}
.cpp //(test)
#include <iostream>
#include <fstream>
#include "MYIMAGE.h"
#include <string>
void test3();
void test5();
int main()
{
test3();
test5();
}
void test3()
{
cout<<"Test overloading operator -"<<endl;
myimage a("im1.pgm");
myimage b("im2.pgm");
myimage res= a-b;
res.save("diff.pgm");
}
void test5()
{
cout<<"Test overloading operator * e operator +"<<endl;
myimage a("im1.pgm");
int minout=200;
int maxout=250;
myimage res=a*((maxout-minout)/255.0)+minout;
res.save("stretch.pgm");
}