Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [C++] Somma di matrici tramite overload dell'operatore +

    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

    codice:
    #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

    codice:
    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

    codice:
    #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:perator=(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...

    Quasi sicuramente sbaglio il passaggio di parametri, aiuto...
    Grazie.

  2. #2

  3. #3
    Originariamente inviato da MacApp
    devi definire il costruttore di copia per la classe CMatrix.
    Intendi una cosa così per l'header:

    codice:
    CMatrix(const CMatrix& C);
    ?

    Poi come la uso nel codice cpp?

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    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.

  5. #5
    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
    codice:
    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

  6. #6
    Originariamente inviato da ^EvAmPiReS^
    Se intendi
    codice:
    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
    Nel costruttore di copia elimina la chiamata a deleteMat ();

  7. #7
    Originariamente inviato da MacApp
    Nel costruttore di copia elimina la chiamata a deleteMat ();




    Grazie

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.