[C++] Problema con ridefinizione degli operatori

di Anonimizzato17776 il
9 risposte
Ciao a tutti. Sto creando un programma nel quale ridefinisco gli operatori per una classe che contiene una matrice, ma ho riscontrato dei problemi con la ridefinizione della somma. Infatti al momento della somma di 2 matrici il programma crasha e mi spunta "errore di segmentazione (core dump creato)".
Di seguito il codice del programma. Grazie in anticipo

#include <iostream>
using namespace std;
class Matrice{
	public:
                //costruttore di default
		Matrice(int s=0):size(s){
                        //allocazione dinamica della matrice
			m=new int*[size];
			for(int h=0;h<size;h++)
				m[h]=new int[size];
                        //inizializzazione matrice
			for(int i=0;i<size;i++){
				for(int j=0;j<size;j++)
					m[i][j]=0;
			}
		}
                //costruttore copia
		Matrice(const Matrice& init):size(init.size){
			m=new int*[size];
			for(int h=0;h<size;h++)
				m[h]=new int[size];
			for(int i=0;i<size;i++){
				for(int j=0;j<size;j++)
					m[i][j]=init.m[i][j];
			}
		}
                //distruttore
		~Matrice(){
			for(int i=0;i<size;i++)
				delete m[i];
			delete m;
		}
		int getS()const{return size;}
		int getM(int a, int b)const{return m[a][b];}
		void setM(int a,int b,int c){m[a][b]=c;}
                //ridefinizione operatore =
		Matrice operator=(const Matrice& a)const{
			for(int i=0;i<size;i++){
				for(int j=0;j<size;j++)
					m[i][j]=a.m[i][j];
			}
			return *this;
		}
                //ridefinizione operatore + (probabilmente è qui l'errore)
		Matrice operator+(const Matrice& a)const{
			Matrice temp;
			for(int i=0;i<size;i++){
				for(int j=0;j<size;j++)
					temp.m[i][j]=m[i][j]+a.m[i][j];
			}
			return temp;
		 }
	private:
		int** m;
		int size;
};
//ridefinizione operatore <<
ostream& operator<<(ostream& os,const Matrice& a){
	for(int i=0;i<a.getS();i++){
		for(int j=0;j<a.getS();j++)
			os<<a.getM(i,j)<<"  ";
		cout<<endl;
	}
	return os;
}
//ridefinizione operatore >>
istream& operator>>(istream& is, Matrice& a){
	int temp;
	for(int i=0;i<a.getS();i++){
		for(int j=0;j<a.getS();j++){
			is>>temp;
			a.setM(i,j,temp);
		}
	}
	return is;
}

int main(){
	Matrice a(2),b(2),c(2);
	cin>>c;
	b=c;
	cout<<b<<endl;
        //qui il programma crasha
	a=b+c;
	cout<<a<<endl;
	return 0;
}

9 Risposte

  • Che dimensioni ha la tua matrice qui?
    
    Matrice operator+(const Matrice& a)const{
             Matrice temp; // <-- qui
    
    A ogni modo l'intera classe sarebbe da rivedere (alla luce dell'efficienza).
  • In teoria non dovrebbe acquisire la dimensione del left operand nella espressione del main? Ho provato a mettere in commento la ridefinizione della somma e il programma funziona
  • Non centra nulla il left operand, quello può anche non esistere. Ma la matrice temp deve avere una dimensione per essere usabile.
  • Il problema è che dovrebbe avere una dimensione variabile. Quindi come dovrei scrivere? Peró è strano, ho usato lo stesso codice per la ridefinizione della somma in una classe con un array monodimensionale e funzionava
  • La dimensione dipende dalla dimensione delle matrici che devi sommare.
    Dato che hai scelto di operare solo su matrici quadre la dimensione la conosci già.
    Ovvio che se una matrice ha dimensione 2x2 non la puoi sommare a una 3x3, il che dovrebbe suggerirti un controllo prima di operare.
    Banalmente la dimensione è this->size
    
    Matrice temp(this->size); // o Matrice temp(size)
    
  • Ok proveró come hai detto tu e ti faró sapere grazie
  • Funziona! Grazie mille.
    ultima domanda. Volevo creare una funzione per avere accesso ad un elemento della matrice ma non ci riesco. Ecco il codice a cui avevo pensato
    
    //funzione
    Int at(int i,int j){return m[i][j];}
    
    //nel main pensavo di fare una cosa del genere(a e b //sono 2 oggetti della classe matrice)
    a.at(0,0)=b.at(0,1)
    
    Purtroppo mi richiede un left operand
  • paco405 ha scritto:


    Purtroppo mi richiede un left operand
    E tu mettilo.
    
    //funzione
    int& at(int i,int j){return m[i][j];}
    
  • Tutto funzionante! grazie mille
Devi accedere o registrarti per scrivere nel forum
9 risposte