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;
}
}