[C++] Problema con ridefinizione degli operatori

di il
9 risposte

[C++] Problema con ridefinizione degli operatori

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

  • Re: [C++] Problema con ridefinizione degli operatori

    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).
  • Re: [C++] Problema con ridefinizione degli operatori

    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
  • Re: [C++] Problema con ridefinizione degli operatori

    Non centra nulla il left operand, quello può anche non esistere. Ma la matrice temp deve avere una dimensione per essere usabile.
  • Re: [C++] Problema con ridefinizione degli operatori

    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
  • Re: [C++] Problema con ridefinizione degli operatori

    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)
    
  • Re: [C++] Problema con ridefinizione degli operatori

    Ok proveró come hai detto tu e ti faró sapere grazie
  • Re: [C++] Problema con ridefinizione degli operatori

    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
  • Re: [C++] Problema con ridefinizione degli operatori

    paco405 ha scritto:


    Purtroppo mi richiede un left operand
    E tu mettilo.
    
    //funzione
    int& at(int i,int j){return m[i][j];}
    
  • Re: [C++] Problema con ridefinizione degli operatori

    Tutto funzionante! grazie mille
Devi accedere o registrarti per scrivere nel forum
9 risposte