PDA

Visualizza la versione completa : [C++] Somma di matrici tramite overload dell'operatore +


^EvAmPiReS^
01-03-2008, 16:29
Salve a tutti, vi posto di seguito il codice che dovrebbe restituire ad un utente, una volta
inseriti i valori per ogni cella e dunque riempite le matrici A e B, una terza matrice C che
rappresenta la somma delle prime due.

MAIN



#include "stdafx.h"

int main(int argc, char* argv[]){

//costruisce tre matrici 2X2
CMatrix A(2,2);
CMatrix B(2,2);
CMatrix C(2,2);

A.leggiValori(); //richiede all’utente di inserire i valori di A
B.leggiValori(); //richiede all’utente di inserire i valori di B

A.stampaValori();
B.stampaValori();
C.stampaValori();

C=A+B; //esegue la somma tra le due matrici costruite

C.stampaValori(); //stampa a video valori

system("PAUSE");

return 0;
}


INTERFACCIA CLASSE MATRIX



class CMatrix{
private:
int **m_mat;
int m_row, m_col;
void allocaMemMat(int m_row, int m_col);
void deleteMat();
public:
CMatrix();
virtual ~CMatrix();

CMatrix(int row, int col);

void stampaValori();
void leggiValori();

CMatrix operator+(const CMatrix & C);
CMatrix & operator=(const CMatrix & C);
};


IMPLEMENTAZIONE DELL'INTERFACCIA



#include "stdafx.h"

CMatrix::CMatrix(){
m_row=m_col=0;
m_mat=0;
}

CMatrix::~CMatrix(){
deleteMat();
}

CMatrix::CMatrix(int row, int col){
m_row=row;
m_col=col;
allocaMemMat(m_row, m_col);
}

void CMatrix::deleteMat(){
for (int i=0; i<m_row; i++)
delete[] m_mat[i];
delete[] m_mat;
m_col=m_row=0;
m_mat=0;
}

void CMatrix::allocaMemMat(int row, int col){
//Non deve esserci nessuna matrice allocata,
//usare prima delleteMat()
m_mat=new int*[m_row];
for (int i=0; i<m_row; i++)
m_mat[i]=new int[m_col];

}

CMatrix CMatrix::operator+(const CMatrix & C){
if ((C.m_row==m_row)&&(C.m_col==m_col)){
CMatrix RIS(m_row, m_col);
for (int i=0; i<m_row; i++){
for (int j=0; j<m_col; j++){
RIS.m_mat[i][j]=C.m_mat[i][j]+ m_mat[i][j];
}
}
return RIS;
}else{
CMatrix RIS;
return RIS;
}
}


CMatrix& CMatrix::operator=(const CMatrix & C){
deleteMat();//cancellazione memoria dinamica
m_row=C.m_row;
m_col=C.m_col;
allocaMemMat(m_row, m_col);//alloco memoria dinamica
for (int i=0; i<m_row; i++)
for (int j=0; j<m_col; j++)
m_mat[i][j] = C.m_mat[i][j];
return *this;
}

void CMatrix::leggiValori(){
int val = 0;

for(int x = 0; x < m_row; x++)
for(int y = 0; y < m_col; y++){
cout<<"Inserisci un numero per la cella: ";
cin>>val;
m_mat[x][y] = val;
}
}
void CMatrix::stampaValori(){
for(int x = 0; x < m_row; x++){
for(int y = 0; y < m_col; y++)
cout<<m_mat[x][y];

cout<<"\n";
}
}


Ricevo un'eccezione e l'esecuzione non supera i due cicli for dell'overload dell'operatore "=".
Provando a fare delle stampe sono sicuro che dentro RIS ci sia la matrice risultante dalla
somma corretta, ma putroppo al metodo CMatrix& CMatrix::operator=(const CMatrix & C)
arrivano due matrici non inizializzate ovvero m_mat (ci sta l'ho appena allocata) e C.m_mat.
La seconda non deve essere vuota ma dovrebbe essere un riferimento a RIS calcolata
precedentemente...
:bhò:
Quasi sicuramente sbaglio il passaggio di parametri, aiuto...
Grazie.

MacApp
01-03-2008, 16:51
devi definire il costruttore di copia per la classe CMatrix.

^EvAmPiReS^
01-03-2008, 17:13
Originariamente inviato da MacApp
devi definire il costruttore di copia per la classe CMatrix.

Intendi una cosa così per l'header:



CMatrix(const CMatrix& C);


?

Poi come la uso nel codice cpp?

shodan
01-03-2008, 18:52
Costruttore di copia e operatore di assegnamento differiscono solo perché nel secondo caso occorre fare un return *this.

Puoi prendere il codice dell'operatore di assegnamento e usarlo nel costruttore di copia.

^EvAmPiReS^
01-03-2008, 19:10
Originariamente inviato da shodan
Costruttore di copia e operatore di assegnamento differiscono solo perché nel secondo caso occorre fare un return *this.

Puoi prendere il codice dell'operatore di assegnamento e usarlo nel costruttore di copia.

Se intendi


CMatrix::CMatrix(const CMatrix & C){
deleteMat();//cancellazione memoria dinamica
m_row=C.m_row;
m_col=C.m_col;
allocaMemMat(m_row, m_col);//alloco memoria dinamica
for (int i=0; i<m_row; i++)
for (int j=0; j<m_col; j++)
m_mat[i][j] = C.m_mat[i][j];
}


non va e da la stessa eccezione :bhò:

MacApp
01-03-2008, 19:19
Originariamente inviato da ^EvAmPiReS^
Se intendi


CMatrix::CMatrix(const CMatrix & C){
deleteMat();//cancellazione memoria dinamica
m_row=C.m_row;
m_col=C.m_col;
allocaMemMat(m_row, m_col);//alloco memoria dinamica
for (int i=0; i<m_row; i++)
for (int j=0; j<m_col; j++)
m_mat[i][j] = C.m_mat[i][j];
}


non va e da la stessa eccezione :bhò:
Nel costruttore di copia elimina la chiamata a deleteMat ();

^EvAmPiReS^
01-03-2008, 19:25
Originariamente inviato da MacApp
Nel costruttore di copia elimina la chiamata a deleteMat ();


:unz:


Grazie :ciauz:

Loading