Delete matrice

di il
5 risposte

Delete matrice

Salve, il mio prof ha realizzato un programma dove va a creare una matrice e a fare varie operazioni. Non capisco perchè nel distruttore c'è scritto : "j<colonne", non bisognerebbe cancellare le righe cancellando il puntatore alle righe (delete[] elementi;)? A cosa serve anche quel for? Grazie.

//costruttore
matrice::matrice(int r,int c){
	colonne = c;
	righe = r;

	int i,j;
	//allocazione del vettore di puntatori a tipoelem
	elementi = new tipoelem* [righe];
	for(i=0; i<righe; i++){
		//allocazione dei singoli vettori righe di elementi di tipo tipoelem
		elementi[i] = new tipoelem[colonne];
	//inizializzazione degli elementi a valore nullo
	}
	for (i=0; i<righe; i++)
		for (j=0; j<colonne; j++)
			elementi[i][j] = 0;
}
matrice::~matrice(){
	for(int j=0; j<colonne; j++)
		delete[] elementi[j];
	delete[]  elementi;
}

5 Risposte

  • Re: Delete matrice

    E' sbagliato ... dovrebbe essere

    j<righe
  • Re: Delete matrice

    Ah ok, grazie. Mentre per quanto riguarda il costruttore matrice::matrice(const matrice &m), questo viene utilizzato nel programma? Il programma funziona anche senza e non capisco il motivo.

    TestMatrice.cpp
    
    #include "matrice.h"
    #include <iostream>
    
    int main(){
    	matrice A(3,2), T(2,3);
    	A.random();
    	A.stampa();
    	T = A.trasposta();
    	T.stampa();
    
    	matrice B(4,4);
    	B.stampa();
    	B = T;
    	B.stampa();
    
    	system("pause");
    	return 0;
    }
    
    Matrice.h
    #ifndef MATRICE_H_
    #define MATRICE_H_
    
    typedef double tipoelem;
    
    class matrice{
      public:
        matrice(int, int); /* costruttore */
        ~matrice();
        matrice(const matrice &); /*costruttore di copia*/
        matrice & operator=(const matrice &); /*operatore di assegnamento*/
        tipoelem leggimatrice(int, int);
        void scrivimatrice(int, int, tipoelem);
        void prodottoscalare(double);
        matrice trasposta();
        void stampa();
        void random();
    
      private:
        int righe;
        int colonne;
        tipoelem **elementi;
    };
    
    Matrice.cpp
    
    #endif /* MATRICE_H_ */
    #include <iostream>
    #include "matrice.h"
    #include <stdlib.h>
    
    //costruttore
    matrice::matrice(int r,int c){
    	colonne = c;
    	righe = r;
    
    	int i,j;
    	//allocazione del vettore di puntatori a tipoelem
    	elementi = new tipoelem* [righe];
    	for(i=0; i<righe; i++){
    		//allocazione dei singoli vettori righe di elementi di tipo tipoelem
    		elementi[i] = new tipoelem[colonne];
    	//inizializzazione degli elementi a valore nullo
    	}
    	for (i=0; i<righe; i++)
    		for (j=0; j<colonne; j++)
    			elementi[i][j] = 0;
    }
    
    //costruttore di copia
    matrice::matrice(const matrice &m){
    	righe = m.righe;
    	colonne = m.colonne;
    
    	int i,j;
    	elementi = new tipoelem* [righe];
    	for(i=0; i<righe; i++)
    		elementi[i] = new tipoelem[colonne];
    	for (i=0; i<righe; i++)
    		for (j=0; j<colonne; j++)
    			elementi[i][j] = m.elementi[i][j];
    }
    
    matrice::~matrice(){
    	for(int i=0; i<righe; i++)
    		delete[] elementi[i];
    	delete[]  elementi;
    }
    
    matrice &matrice::operator=(const matrice &m){
    	//evita gli auto assegnamenti
    	if (this == &m) return *this;
    	else {
    		int i,j;
    		if(colonne != m.colonne || righe != m.righe){
    			this->~matrice();
    			colonne = m.colonne;
    			righe = m.righe;
    			elementi = new tipoelem* [righe];
    			for (i=0; i<righe; i++)
    				elementi[i] = new tipoelem[colonne];
    		}
    		for (i=0; i<righe;i++)
    			for (j=0; j<colonne; j++)
    				elementi[i][j] = m.elementi[i][j];
    	}
    	return *this;
    }
    
    tipoelem matrice::leggimatrice(int r,int c){
    	return elementi[r][c];
    }
    
    void matrice::scrivimatrice(int r,int c, tipoelem e){
    	elementi[r][c] = e;
    }
    
    void matrice::prodottoscalare(double c){
    	for (int i=0; i<righe; i++)
    		for (int j=0; j<colonne; j++)
    			elementi[i][j] = c * elementi[i][j];
    }
    
    matrice matrice::trasposta(){
    	matrice T(colonne,righe);
    
    	for(int i=0; i<righe; i++)
    		for (int j=0; j<colonne; j++)
    			T.scrivimatrice(j,i,elementi[i][j]);
    	return T; //attenzione è errato se non si implementa il sovraccarico di operator=
    }
    
    void matrice::stampa(){
    	std::cout << std::endl;
    	for(int i=0; i<righe; i++){
    		std::cout << std::endl;
    		for(int j=0; j<colonne; j++)
    			std::cout << elementi[i][j] << " ";
    	}
    	std::cout << std::endl;
    }
    
    void matrice::random(){
    	for (int i=0; i<righe; i++)
    		for(int j=0; j<colonne; j++){
    			elementi[i][j] = rand() % 100;
    		}
    }
  • Re: Delete matrice

    Quello è il costruttore di copia. Hai studiato a cosa serve e quando serve?
  • Re: Delete matrice

    Si, però non capisco la differenza tra il costruttore di copia e il sovraccarico dell'operatore di uguaglianza.
  • Re: Delete matrice

    Stai studiando il C++ in un thread di un forum?

    La domanda sul delete e conclusa.
Devi accedere o registrarti per scrivere nel forum
5 risposte