• Jueves 14 de Noviembre de 2024, 16:51

Autor Tema:  Herencia de una clase  (Leído 2214 veces)

Checho360

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Herencia de una clase
« en: Martes 29 de Marzo de 2011, 21:42 »
0
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++
  1. #include <iostream>
  2. #include <cmath>
  3. #define MAX_SIZE 10
  4. using namespace std;
  5.  
  6. class matrix {
  7.       public:
  8.              int col, fil;
  9.              double s[MAX_SIZE][MAX_SIZE];
  10.              matrix (int n, int m);
  11.              matrix(const matrix& A);
  12.              matrix operator = (matrix A);
  13.              matrix operator + (matrix A);
  14.              matrix scan_matrix (void);
  15.              void print_matrix (void);
  16.              ~matrix(){}
  17.       };
  18.      
  19. matrix :: matrix(int n, int m){
  20.        if(n>MAX_SIZE){
  21.                       cerr<<"ERROR: el numero de filas introducidas es mayor del permitido";
  22.                       fil=MAX_SIZE;
  23.                       }
  24.        else{
  25.             fil=n;
  26.             }
  27.        if(m>MAX_SIZE){
  28.                       cerr<<"ERROR: el numero de columnas introducidas es mayor del permitido";
  29.                       col=MAX_SIZE;
  30.                       }
  31.        else{
  32.              col=m;
  33.             }
  34. }
  35.  
  36. matrix :: matrix (const matrix& A){
  37.        fil=A.fil;col=A.col;
  38.        for(int i=0;i<A.fil;i++){
  39.                for(int j=0;j<A.col;j++){
  40.                        s[i][j]=A.s[i][j];
  41.                        }
  42.                }
  43. }
  44.  
  45. matrix matrix :: operator + (matrix A){
  46.        if(col!=A.col || fil != A.fil){
  47.                      cerr<<"ERROR: el numero de filas o columnas de las matrices introducidas no coinciden";
  48.                      }
  49.        matrix C(A.fil,A.col);
  50.        for(int i=0;i<A.fil;i++){
  51.                for (int j=0;j<A.col;j++){
  52.                    C.s[i][j]=s[i][j]+A.s[i][j];
  53.                }
  54.        }
  55.        return C;
  56. }
  57.  
  58. matrix matrix ::operator = (matrix A){
  59.        fil = A.fil; col = A.col;
  60.        for(int i=0;i<A.fil;i++){
  61.                 for (int j=1;j<A.col;j++){
  62.                 s[i][j]=A.s[i][j];
  63.                 }
  64.        }
  65. }
  66.  
  67. matrix matrix :: scan_matrix (void){
  68.        for (int i=0;i<fil;i++){
  69.            for(int j=0;j<col;j++){
  70.                    cout<<"Introduzca el coef "<<i<<" "<<j<<"n";
  71.                    cin>>s[i][j];
  72.                    }
  73.            }
  74. }
  75.  
  76. void matrix :: print_matrix (void){
  77.      for (int i=0;i<fil;i++){
  78.          for(int j=0;j<col;j++){
  79.                  cout<<"El coef "<<i<<" "<<j<<" = "<<s[i][j]<<"n";
  80.                  }
  81.          }
  82. }
  83.  
  84. class square_matrix : public matrix {
  85.       public:
  86.              square_matrix(int size) : matrix (size,size) {}
  87.              ~square_matrix () {}
  88. };
  89.  
  90. class vector : public matrix {
  91.       public:
  92.              vector (int size) : matrix(1,size) {}
  93.              ~vector () {}
  94. };
  95.  
  96. int main (){
  97.     matrix A(2,2);square_matrix B(2);vector C(2);vector D(2);
  98.     A.scan_matrix();B.scan_matrix();C.scan_matrix();D.scan_matrix();
  99.     matrix F=(A+B);F.print_matrix();
  100.     matrix E(C+D);
  101.     system("pause");
  102. }
  103.  
  104.  

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

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Herencia de una clase
« Respuesta #1 en: Miércoles 30 de Marzo de 2011, 00:05 »
0
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

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Re: Herencia de una clase
« Respuesta #2 en: Miércoles 30 de Marzo de 2011, 00:46 »
0
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.

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

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Re: Herencia de una clase
« Respuesta #3 en: Miércoles 30 de Marzo de 2011, 20:22 »
0
Por cierto, el programa compilar compila pero no funciona :S

Código: C++
  1. #include <iostream>
  2. #include <cmath>
  3. #define MAX_SIZE 10
  4. using namespace std;
  5.  
  6. class matrix {
  7.       public:
  8.              int col, fil;
  9.              double s[MAX_SIZE][MAX_SIZE];
  10.              matrix (int n, int m);
  11.              matrix (){};
  12.              matrix(const matrix& A);
  13.              matrix operator = (matrix A);
  14.              matrix operator + (matrix A);
  15.              matrix scan_matrix (void);
  16.              void print_matrix (void);
  17.              ~matrix(){}
  18.       };
  19.      
  20. matrix :: matrix(int n, int m){
  21.        if(n>MAX_SIZE){
  22.                       cerr<<"ERROR: el numero de filas introducidas es mayor del permitido";
  23.                       fil=MAX_SIZE;
  24.                       }
  25.        else{
  26.             fil=n;
  27.             }
  28.        if(m>MAX_SIZE){
  29.                       cerr<<"ERROR: el numero de columnas introducidas es mayor del permitido";
  30.                       col=MAX_SIZE;
  31.                       }
  32.        else{
  33.              col=m;
  34.             }
  35. }
  36.  
  37. matrix :: matrix (const matrix& A){
  38.        fil=A.fil;col=A.col;
  39.        for(int i=0;i<A.fil;i++){
  40.                for(int j=0;j<A.col;j++){
  41.                        s[i][j]=A.s[i][j];
  42.                        }
  43.                }
  44. }
  45.  
  46. matrix matrix :: operator + (matrix A){
  47.        if(col!=A.col || fil != A.fil){
  48.                      cerr<<"ERROR: el numero de filas o columnas de las matrices introducidas no coinciden";
  49.                      }
  50.        matrix C(A.fil,A.col);
  51.        for(int i=0;i<A.fil;i++){
  52.                for (int j=0;j<A.col;j++){
  53.                    C.s[i][j]=s[i][j]+A.s[i][j];
  54.                }
  55.        }
  56.        return C;
  57. }
  58.  
  59. matrix matrix ::operator = (matrix A){
  60.        fil = A.fil; col = A.col;
  61.        for(int i=0;i<A.fil;i++){
  62.                 for (int j=1;j<A.col;j++){
  63.                 s[i][j]=A.s[i][j];
  64.                 }
  65.        }
  66. }
  67.  
  68. matrix matrix :: scan_matrix (void){
  69.        for (int i=0;i<fil;i++){
  70.            for(int j=0;j<col;j++){
  71.                    cout<<"Introduzca el coef "<<i<<" "<<j<<"n";
  72.                    cin>>s[i][j];
  73.                    }
  74.            }
  75. }
  76.  
  77. void matrix :: print_matrix (void){
  78.      for (int i=0;i<fil;i++){
  79.          for(int j=0;j<col;j++){
  80.                  cout<<"El coef "<<i<<" "<<j<<" = "<<s[i][j]<<"n";
  81.                  }
  82.          }
  83. }
  84.  
  85. class square_matrix : public matrix {
  86.       public:
  87.              square_matrix(int size) : matrix (size,size) {}
  88.              ~square_matrix () {}
  89. };
  90.  
  91. class vector : public matrix {
  92.       public:
  93.              vector (int size) : matrix(1,size) {}
  94.              vector(const matrix& A);
  95.              ~vector () {}
  96. };
  97.  
  98. vector :: vector (const matrix& A){
  99.        col=A.col;
  100.        for(int i=0;i<A.fil;i++){
  101.                        s[1][i]=A.s[1][i];
  102.                        }
  103. }
  104.  
  105. int main (){
  106.     matrix A(2,2);square_matrix B(2);vector C(2);vector D(2);
  107.     A.scan_matrix();B.scan_matrix();C.scan_matrix();D.scan_matrix();
  108.     matrix F=(A+B);F.print_matrix();
  109.     vector E(C+D);
  110.     system("pause");
  111. }
  112.  
  113.  

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Herencia de una clase
« Respuesta #4 en: Miércoles 30 de Marzo de 2011, 21:59 »
0
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??

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)".

Checho360

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Re: Herencia de una clase
« Respuesta #5 en: Miércoles 30 de Marzo de 2011, 22:24 »
0
Bueno, tenía el constructor copia mal, quedaria asi:

Código: C++
  1. vector :: vector (const matrix& A):matrix(A){
  2.        col=A.col;
  3.        for(int i=0;i<A.fil;i++){
  4.                s[0][i]=A.s[0][i];
  5.                }
  6. }
  7.  

Y ademas encontre otra solución al sobrecargar del operador +:

Código: C++
  1. vector vector :: operator + (vector m){
  2.        vector C(m.col);
  3.        for(int i=0;i<m.col;i++){
  4.                C.s[0][i]=s[0][i]+m.s[0][i];
  5.                }
  6.        return C;
  7. }
  8.  

Lo que no entiendo es por que no se puede poner esto:

Código: C++
  1. vector vector :: operator = (matrix m){
  2.        vector C(m.col);
  3.        for(int i=0;i<m.col;i++){
  4.                C.s[0][i]=m.s[0][i];
  5.                }
  6.        return C;
  7. }
  8.  

*--------------------------------------------------------*

Si alguien me puede explicar por que hay que poner:

Código: C++
  1. vector :: vector (const matrix& A):matrix(A)
  2.  

En lugar de:

Código: C++
  1. vector :: vector (const matrix& A)
  2.  

Esque en las definiciones de constructores copia que yo lei nunca ponen esa forma de declarar

Un saludo!!