Programación General > C/C++

 Herencia de una clase

(1/2) > >>

Checho360:
Hola; estoy creando otro programa probando con eso de la herencia y tengo una duda acerca de una cosa. El código es el siguiente:


--- Código: C++ ---#include <iostream>#include <cmath>#define MAX_SIZE 10using namespace std; class matrix {      public:             int col, fil;              double s[MAX_SIZE][MAX_SIZE];             matrix (int n, int m);             matrix(const matrix& A);             matrix operator = (matrix A);             matrix operator + (matrix A);             matrix scan_matrix (void);             void print_matrix (void);             ~matrix(){}      };      matrix :: matrix(int n, int m){       if(n>MAX_SIZE){                      cerr<<"ERROR: el numero de filas introducidas es mayor del permitido";                      fil=MAX_SIZE;                      }       else{            fil=n;            }       if(m>MAX_SIZE){                      cerr<<"ERROR: el numero de columnas introducidas es mayor del permitido";                      col=MAX_SIZE;                      }       else{             col=m;            }} matrix :: matrix (const matrix& A){       fil=A.fil;col=A.col;       for(int i=0;i<A.fil;i++){               for(int j=0;j<A.col;j++){                       s[i][j]=A.s[i][j];                       }               }}  matrix matrix :: operator + (matrix A){       if(col!=A.col || fil != A.fil){                     cerr<<"ERROR: el numero de filas o columnas de las matrices introducidas no coinciden";                     }       matrix C(A.fil,A.col);       for(int i=0;i<A.fil;i++){               for (int j=0;j<A.col;j++){                   C.s[i][j]=s[i][j]+A.s[i][j];               }       }       return C;} matrix matrix ::operator = (matrix A){       fil = A.fil; col = A.col;       for(int i=0;i<A.fil;i++){                for (int j=1;j<A.col;j++){                s[i][j]=A.s[i][j];                }       }} matrix matrix :: scan_matrix (void){       for (int i=0;i<fil;i++){           for(int j=0;j<col;j++){                   cout<<"Introduzca el coef "<<i<<" "<<j<<"n";                   cin>>s[i][j];                   }           }} void matrix :: print_matrix (void){     for (int i=0;i<fil;i++){         for(int j=0;j<col;j++){                 cout<<"El coef "<<i<<" "<<j<<" = "<<s[i][j]<<"n";                 }         }} class square_matrix : public matrix {      public:             square_matrix(int size) : matrix (size,size) {}             ~square_matrix () {}}; class vector : public matrix {      public:             vector (int size) : matrix(1,size) {}             ~vector () {}}; int main (){    matrix A(2,2);square_matrix B(2);vector C(2);vector D(2);    A.scan_matrix();B.scan_matrix();C.scan_matrix();D.scan_matrix();    matrix F=(A+B);F.print_matrix();    matrix E(C+D);    system("pause");}  
Si os fijais en las ultimas lineas sumo dos vectores y esta suma la tengo que almacenar en un objeto de la clase matrix. Es logico porque arriba a la hora de declarar las funciones tengo escrito "matrix operator", lo cual dice que devuelve un objeto del tipo "matrix". Me preguntaba si se podría modificar el código de alguna manera para poder almacenar la suma en un objeto del tipo "vector" en lugar del tipo "matrix".

Un saludo!!

Amilius:
Para almacenar la suma en "vector" basta sobrecargar el constructor copia de "vector" para poder recibir const matrix&. Además tienes que agregar un constructor sin párametros "default constructor" para "matrix" y también es buena idea si las clases hijas tienen uno.

Supongo que todo esto es simple ejercicio académico, por que es un poco absurdo tener esas dos clases hijas, puesto que tienen el mismo comportamiento y miembros de la clase padre.

Checho360:

--- Cita de: "Amilius" ---Para almacenar la suma en "vector" basta sobrecargar el constructor copia de "vector" para poder recibir const matrix&. Además tienes que agregar un constructor sin párametros "default constructor" para "matrix" y también es buena idea si las clases hijas tienen uno.

Supongo que todo esto es simple ejercicio académico, por que es un poco absurdo tener esas dos clases hijas, puesto que tienen el mismo comportamiento y miembros de la clase padre.
--- Fin de la cita ---

ostia pues tienes razón jajajja si le declaro el default constructor luego me deja sobrecargar el constructor copia de "vector" y luego claro ya puedo. Pero no entiendo por que hay que darle esa declaración de constructor default para que luego me deje sobrecargar el copia. Me puedes decir??

Ah,y por cierto, si es un ejercicio de aprendizaje.

Un saludo y muchisimas gracias!

Checho360:
Por cierto, el programa compilar compila pero no funciona :S


--- Código: C++ ---#include <iostream>#include <cmath>#define MAX_SIZE 10using namespace std; class matrix {      public:             int col, fil;              double s[MAX_SIZE][MAX_SIZE];             matrix (int n, int m);             matrix (){};             matrix(const matrix& A);             matrix operator = (matrix A);             matrix operator + (matrix A);             matrix scan_matrix (void);             void print_matrix (void);             ~matrix(){}      };      matrix :: matrix(int n, int m){       if(n>MAX_SIZE){                      cerr<<"ERROR: el numero de filas introducidas es mayor del permitido";                      fil=MAX_SIZE;                      }       else{            fil=n;            }       if(m>MAX_SIZE){                      cerr<<"ERROR: el numero de columnas introducidas es mayor del permitido";                      col=MAX_SIZE;                      }       else{             col=m;            }} matrix :: matrix (const matrix& A){       fil=A.fil;col=A.col;       for(int i=0;i<A.fil;i++){               for(int j=0;j<A.col;j++){                       s[i][j]=A.s[i][j];                       }               }}  matrix matrix :: operator + (matrix A){       if(col!=A.col || fil != A.fil){                     cerr<<"ERROR: el numero de filas o columnas de las matrices introducidas no coinciden";                     }       matrix C(A.fil,A.col);       for(int i=0;i<A.fil;i++){               for (int j=0;j<A.col;j++){                   C.s[i][j]=s[i][j]+A.s[i][j];               }       }       return C;} matrix matrix ::operator = (matrix A){       fil = A.fil; col = A.col;       for(int i=0;i<A.fil;i++){                for (int j=1;j<A.col;j++){                s[i][j]=A.s[i][j];                }       }} matrix matrix :: scan_matrix (void){       for (int i=0;i<fil;i++){           for(int j=0;j<col;j++){                   cout<<"Introduzca el coef "<<i<<" "<<j<<"n";                   cin>>s[i][j];                   }           }} void matrix :: print_matrix (void){     for (int i=0;i<fil;i++){         for(int j=0;j<col;j++){                 cout<<"El coef "<<i<<" "<<j<<" = "<<s[i][j]<<"n";                 }         }} class square_matrix : public matrix {      public:             square_matrix(int size) : matrix (size,size) {}             ~square_matrix () {}}; class vector : public matrix {      public:             vector (int size) : matrix(1,size) {}             vector(const matrix& A);             ~vector () {}}; vector :: vector (const matrix& A){       col=A.col;       for(int i=0;i<A.fil;i++){                       s[1][i]=A.s[1][i];                       }}  int main (){    matrix A(2,2);square_matrix B(2);vector C(2);vector D(2);    A.scan_matrix();B.scan_matrix();C.scan_matrix();D.scan_matrix();    matrix F=(A+B);F.print_matrix();    vector E(C+D);    system("pause");}  

Amilius:
Revisa la implementación del constructor copia de vector, estas llenando con la segunda fila "1" en lugar de la primera "0", además estás iterando sobre filas siendo que definiste que tu vector sólo tiene una fila.
Es mejor que cambies los nombres de "n" y "m" por algo mejor como "fil" "col", o "aFil", "aCol" para evitar confusiones. Los miembros col y fil no necesitan ser públicos, pueden ser privados y tener un nombre que denote que son privados como "_col" y "_fil".


--- Citar ---Pero no entiendo por que hay que darle esa declaración de constructor default para que luego me deje sobrecargar el copia. Me puedes decir??

--- Fin de la cita ---

Es necesario construir lo que corresponde a la clase base antes que la clase hija. Otra forma de hacerlo, sin tener que definir un constructor "by default" para matrix, es especificar en la implementación del constructor de la clase hija el constructor de la clase base que queremos usar. Por ejemplo: ": Matrix(0,0)".

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa