Código
#include <iostream> #include <stdlib.h> #include <conio.h> #include <time.h> using namespace std; //Clase Matriz class Matriz{ protected: int **M; int NF,NC; public: //Constructor por defecto Matriz (){ NF=0; NC=0; M=NULL; } //Constructor de copia Matriz (const Matriz &matriz){ NF=matriz.NF; NC=matriz.NC; M=new int *[NF]; for(int i=0;i<NF;i++){ M[i]=new int[NC]; } } //Constructor con parametros Matriz (int nf, int nc){ M=new int *[nf]; for(int i=0;i<nf;i++){ M[i]=new int[nc]; } for(int i=0;i<nf;i++){ for(int j=0;j<nc;j++){ M[i][j]=rand()%51; } } return; } //Destructor ~Matriz(){ for(int i=0;i<NF;i++){ delete M[i]; } return; } //Operador asignacion Matriz operator = (Matriz m){ if(NF!=m.NF){ for(int i=0;i<NF;i++){ delete M[i]; } } NF=m.NF; NC=m.NC; M=new int *[NF]; for(int j=0;j<NF;j++){ M[j]=new int [NC]; } return(*this); } //Sobrecarga de operador de salida friend ostream& operator <<(ostream &medio, Matriz matriz){ for(int i=0;i<matriz.NF;i++){ for(int j=0;j<matriz.NC;j++){ cout<<matriz.M[i][j]<<" "; } cout<<endl; } return(medio); } //Sobrecarga de operador suma Matriz operator + (Matriz m){ Matriz resul; if(NF==m.NF&&NC==m.NC){ for(int i=0;i<NF;i++){ for(int j=0;j<NC;j++){ resul.M[i][j]=M[i][j]+m.M[i][j]; } } } return(resul); } //Sobrecarga de operador resta Matriz operator - (Matriz m){ Matriz resul; if(NF==m.NF&&NC==m.NC){ for(int i=0;i<NF;i++){ for(int j=0;j<NC;j++){ resul.M[i][j]=M[i][j]-m.M[i][j]; } } } return(resul); } //Sobrecarga de operador producto Matriz operator * (Matriz m){ Matriz resul; if(NC==m.NF){ int N=NC; for(int i=0;i<N;i++){ for(int j=0;j<N;j++){ resul.M[i][j]=0; for(int k=0;k<N;k++){ resul.M[i][j]=resul.M[i][j]+M[i][k]*m.M[k][j]; } } } } return(resul); } }; int main(void){ //Reinicio de semilla srand(time(0)); //Prueba de codigo Matriz m1(5,5),m2(5,5); cout<<"Matriz 1 + Matriz 2 ="<<endl<<m1+m2; getche(); return(0); }
Como se puede observar, el constructor con parámetros crea una matriz de NFxNC elementos, los cuales son valores aleatorios entre 0 y 50. El caso es que al probar la suma, y a pesar del getche(), el programa se ejecuta y se cierra automáticamente, y lo más extraño de todo, me devuelve 3. Es curioso, porque aunque no se realizara bien la operación, debería devolver 0, ya que compila sin problemas, pero devuelve 3. Por otro lado, si las matrices declaradas en main no llevan parámetros, el programa se ejecuta con normalidad, mostrando el texto del cout sin matriz (porque es nula), espera que pulse una tecla para continuar y devuelve 0. Por tanto, puedo suponer que el problema está, bien en el envío de parámetros, en el constructor de copia, o incluso en la sobrecarga del operador suma, pero no acabo de verlo. Por si sirve de algo, el compilador que utilizo es el QtCreator de Nokia.
Gracias por vuestra paciencia