Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Herencia de una clase

Estas en el tema de Herencia de una clase en el foro de C/C++ en Foros del Web. 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: @import ...
  #1 (permalink)  
Antiguo 29/03/2011, 14:32
 
Fecha de Ingreso: marzo-2011
Mensajes: 94
Antigüedad: 10 años, 5 meses
Puntos: 3
Herencia de una clase

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++:
Ver original
  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 coincide\n";
  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. }

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!!
  #2 (permalink)  
Antiguo 29/03/2011, 15:39
 
Fecha de Ingreso: junio-2005
Mensajes: 93
Antigüedad: 16 años, 3 meses
Puntos: 9
Respuesta: Herencia de una clase

solo es necesario declarar un constructor que reciba como parametro un objeto de tipo matriz matrix en la definicion de la clase vector, o un una

class vector: public matrix
{
public :

vector(const matrix&mat)
{

}
}
  #3 (permalink)  
Antiguo 29/03/2011, 16:02
 
Fecha de Ingreso: marzo-2011
Mensajes: 94
Antigüedad: 10 años, 5 meses
Puntos: 3
Respuesta: Herencia de una clase

Cita:
Iniciado por dragg04 Ver Mensaje
solo es necesario declarar un constructor que reciba como parametro un objeto de tipo matriz matrix en la definicion de la clase vector, o un una

class vector: public matrix
{
public :

vector(const matrix&mat)
{

}
}
Estuve intentandolo haciendolo asi:

Código C++:
Ver original
  1. vector operator = (matrix A){
  2.                     col=A.col;
  3.                     for(int i=0;i<A.col;i++){
  4.                     s[1][i]=A.s[1][i];
  5.                     }}

Pero no funciona :S
  #4 (permalink)  
Antiguo 29/03/2011, 18:00
 
Fecha de Ingreso: junio-2005
Mensajes: 93
Antigüedad: 16 años, 3 meses
Puntos: 9
Respuesta: Herencia de una clase

Que error te arroja
  #5 (permalink)  
Antiguo 29/03/2011, 18:11
 
Fecha de Ingreso: marzo-2011
Mensajes: 94
Antigüedad: 10 años, 5 meses
Puntos: 3
Respuesta: Herencia de una clase

Cita:
Iniciado por dragg04 Ver Mensaje
Que error te arroja
Da muchos errores, prueba tu mismo.

Me dieron una solución en otro sitio: sobrecargar el constructor copia de vector para que reciba una matriz y declarar un constructor default en la clase matrix. Quedaría asi:

Código C++:
Ver original
  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 coincide\n";
  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. }

Aunque no entiendo muy bien por que funciona asi :P

Un saludo!!
  #6 (permalink)  
Antiguo 29/03/2011, 23:33
 
Fecha de Ingreso: junio-2005
Mensajes: 93
Antigüedad: 16 años, 3 meses
Puntos: 9
Respuesta: Herencia de una clase

EN SI ESA FUE MI SUGERENCIA :D.

BIEN EL PORQUE DE QUE FUNCIONE ES QUE LA SOBRECARGA DEL OPERADOR "+" REGRESA UNA INSTANCIA DE TIPO MATRIX, Y HASTA ANTES DE LA CORRECCION QUE HICISTE NO TENIAS UN CONSTRUCTOR QUE RECIBIERA COMO PARAMETRO UNA INSTANCIA DE MATRIX, POR LO QUE EL COMPILADOR TE DECIA QUE NO HABIA UN CONSTRUCTOR QUE RECIBIERA UN PARAMETRO DE TIPO MATRIX.

SOLO UN DETALLE EN LA SOBRECARGA DEL OPERADOR "=" NO REGRESAS NINGUN VALOR.

MI SUGERENCIA ES

matrix matrix ::operator = (const 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];
}
}
return *this;
}

AHORA BIEN, ACOSTUMBRATE A QUE CADA VEZ QUE PASES UN OBJETO, LO PASES POR REFERENCIA, ESTO EVITARA QUE SE HAGA UNA COPIA DE EL CADA VEZ QUE SE PASE COMO PARAMETRO, MEJORANDO ASI LA VELOCIDAD DE EJECUCCION
  #7 (permalink)  
Antiguo 30/03/2011, 03:47
 
Fecha de Ingreso: marzo-2011
Mensajes: 94
Antigüedad: 10 años, 5 meses
Puntos: 3
Respuesta: Herencia de una clase

Bueno aprovecho a preguntarte un par de cosas ya que me estas ayudando:

1) Entiendo que hay que comunicarle al programa que si recibe una matrix se puede escribir como un vector, pero, no entiendo porque hay que darle a la clase matrix el constructor default ni tampoco por que hay que darle a la clase vector el constructor copia; si vas a poner vector E = A+ B ; para mi tiene mas sentido comunicarle algo asi:

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

Pero con eso no funciona.

2) eso de *return this; funciona para retornar todas las asignaciones que se dieron durante la ejecucion de dicha funcion??

3)Para pasarle un objeto por referencia; como se declara la funcion?? le dices que le vas a pasar dos enteros (por ejemplo) y luego le pasas los enteros con la & delante o le dices directamente que le vas a pasar la referencia??

Un saludo y muchas gracias por contestar!
  #8 (permalink)  
Antiguo 30/03/2011, 11:28
 
Fecha de Ingreso: junio-2005
Mensajes: 93
Antigüedad: 16 años, 3 meses
Puntos: 9
Respuesta: Herencia de una clase

no es necesario crear un constructor por default para la clase matrix, sin embaro si quieres hacer

vector c; //no te va dejar ya que no existe un construtor por default

. Ahora bien creo que deberías dar una leida acerca de clases y programacion en c++(referencias, punteros, funciones). ya que veo que tienes dudas que deberias tener ya tener resultas para abordar temas tales como la sobrecarga de operadores.

pero te resolvere tus dudas de manera escueta claro esta

2) this es en apuntador a la la instancia de la clase, asi que cuando retornas *this, lo que estas haciendo es retorar el objeto en si.

3) la referencia es cuando tu pones & a un parametro, es casi necesario para cuando vas pasar un objeto como parametro, ya que evita hacer una copia.

ej.

matrix matrix :: operator + (const matrix &A);

el const se pone para indiciar que el valor no sera modificado dentro de la funcion, para los valores nativos(int, double...) no es necesario el paso por referencia

por cierto tu constructor que reciba como parametro un objeto de tipo matrix lo correcto seria

vector::vector (const matrix& A):matrix(A){}
  #9 (permalink)  
Antiguo 30/03/2011, 11:55
 
Fecha de Ingreso: marzo-2011
Mensajes: 94
Antigüedad: 10 años, 5 meses
Puntos: 3
Respuesta: Herencia de una clase

Cita:
Iniciado por dragg04 Ver Mensaje
vector::vector (const matrix& A):matrix(A){}
Me podrias explicar eso??

Ah, y por cierto, el programa compilar compila pero no hace lo que yo quiero, no suma los vectores

Muchas gracias por tu ayuda!!

Última edición por Checho360; 30/03/2011 a las 12:19
  #10 (permalink)  
Antiguo 30/03/2011, 12:46
 
Fecha de Ingreso: junio-2005
Mensajes: 93
Antigüedad: 16 años, 3 meses
Puntos: 9
Respuesta: Herencia de una clase

insisto, creo que deberias de leer temas de como crear clases en c++.

el codigo lo hiciste tu?, te pregunto eso por que tu pregunta de que significa

vector::vector (const matrix& A):matrix(A)

deberías saber que es por tu utilizaste lo mismo aqui:

vector (int size) : matrix(1,size)

logico que no te va a sumar ya que tienes mal

vector::vector (const matrix& A):matrix(A){}

vector vector::operator = (const matrix & A){
col=A.col;
fil=A.fil;
for(int i=0;i<A.col;i++){
s[0][i]=A.s[0][i];
}
return *this;

}
para empezar los arreglos en c++ empiezan en 0, y lo que tienes que recorrer son las columnas no los renglones
  #11 (permalink)  
Antiguo 30/03/2011, 13:24
 
Fecha de Ingreso: marzo-2011
Mensajes: 94
Antigüedad: 10 años, 5 meses
Puntos: 3
Respuesta: Herencia de una clase

Sisi el codigo lo hice yo; entiendo lo que yo hice. Derivo una clase de otra base; pero tu utilizas el operador :: y despues : ... no entiendo...
Tienes razon tengo mal eso.

Si me puedes pasar un libro o algo donde lo expliquen bien esto de las clases y eso... porque me estoy haciendo un lio.

Esque yo pruebo a sobrecargar el + con vectores y le digo que cree a partir de la suma de dos vectores cree dos vectores y asi lo hace y funciona, sin embargo si le digo esto:

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

que viene a ser que a partir de una igualdad de un vector a una matriz genere el vector... pero este no funciona y no entiendo por que

Un saludo!!

Última edición por Checho360; 30/03/2011 a las 13:41
  #12 (permalink)  
Antiguo 30/03/2011, 14:58
 
Fecha de Ingreso: junio-2005
Mensajes: 93
Antigüedad: 16 años, 3 meses
Puntos: 9
Respuesta: Herencia de una clase

class CClaseA
{
public:
CClaseA()
{
}
};

class CClaseB:public CClaseA
{
public:
CClaseB();
}


//aquí se indica que el constructor por default de la clase B va a llamar primero al contructor de la clase A.
CClaseB::CClaseB():CClaseA()
{
}

puedes mostrar el codigo completo, y mostrar exactamente que error te arroja o como sabes que no funciona
  #13 (permalink)  
Antiguo 30/03/2011, 15:04
 
Fecha de Ingreso: marzo-2011
Mensajes: 94
Antigüedad: 10 años, 5 meses
Puntos: 3
Respuesta: Herencia de una clase

Si mira te comento al completo:

Si utilizo lo que dices:

Código C++:
Ver original
  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. }

Funciona, aunque no se muy bien como va eso porque yo todas las declaraciones que lei del constructor copia era:

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


En lugar de:

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

Ademas si pruebo con el operador + sobrecargado tambien funciona:

Código C++:
Ver original
  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. }

Pero si pruebo con el operador = no funciona:

Código C++:
Ver original
  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 coincide\n";
  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(0,size) {}
  94.              vector () {};
  95.              vector operator = (matrix m);
  96.              ~vector () {}
  97. };
  98.  
  99. vector vector :: operator = (matrix m){
  100.        vector C(m.col);
  101.        for(int i=0;i<m.col;i++){
  102.                C.s[0][i]=m.s[0][i];
  103.                }
  104.        return C;
  105. }
  106.  
  107. int main (){
  108.     vector C(2);vector D(2);
  109.     C.scan_matrix();D.scan_matrix();
  110.     vector E=(C+D);E.print_matrix();
  111.     system("pause");
  112. }

El error que arroja es:

Código:
110 conversion from `matrix' to non-scalar type `vector' requested
Un saludo y gracias por ayudarme!!
  #14 (permalink)  
Antiguo 30/03/2011, 22:14
 
Fecha de Ingreso: junio-2005
Mensajes: 93
Antigüedad: 16 años, 3 meses
Puntos: 9
Respuesta: Herencia de una clase

class vector : public matrix {
public:
vector (int size) : matrix(1,size) {}
vector(const matrix& A);
vector operator = (const matrix & A);
~vector () {}
};


vector::vector (const matrix& A):matrix(A){}

vector vector::operator = (const matrix & A){

matrix::matrix(A);
return *this;
}
  #15 (permalink)  
Antiguo 01/04/2011, 03:51
 
Fecha de Ingreso: febrero-2003
Ubicación: D.F.
Mensajes: 163
Antigüedad: 18 años, 7 meses
Puntos: 22
Respuesta: Herencia de una clase

Cita:
Iniciado por Checho360 Ver Mensaje
Si me puedes pasar un libro o algo donde lo expliquen bien esto de las clases y eso... porque me estoy haciendo un lio.
Curso de C++
Thinking in C++ Vol 1(español)
The C++ Programming Language

Etiquetas: clase, herencia
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:12.