• Viernes 15 de Noviembre de 2024, 07:20

Autor Tema:  Consulta en clases  (Leído 2511 veces)

Checho360

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Consulta en clases
« en: Lunes 28 de Marzo de 2011, 14:18 »
0
Hola; estoy trabajando algo con las clases en C++ y consigo que me corran lo programas. Veamos para mi lo logico al crear este programa de sumar vectores es:

Código: C++
  1. #include <iostream>
  2. using namespace std;
  3. #define MAX_SIZE 10
  4.  
  5. class matrix{
  6.       public:
  7.              int size; double s[MAX_SIZE];
  8.              matrix (int n){
  9.                     if (n>MAX_SIZE) {cerr<<"Error tamaño demasiado grande";
  10.                     return;}
  11.                     size=n;
  12.                     for(int i=0;i<n;i++){
  13.                             cout<<"Ingresa el coef "<<i<<"n";cin>>s[i];
  14.                             }
  15.              }
  16.              ~matrix() {};
  17.              void suma_de_vectores (matrix A,matrix B);
  18. };
  19.  
  20. void matrix :: suma_de_vectores (matrix A, matrix B){
  21.      if(A.size!=size){cerr<<"Los vectores han de ser del mismo orden";return;}
  22.      for(int i=0;i<A.size;i++){
  23.              cout<<"suma "<<i<<" = "<<A.s[i]+s[i];}
  24.      }
  25.  
  26. int main(){
  27.     int n;int m;
  28.     cout<<"Introduzca el orden del vector1n";cin>>n;
  29.    
  30.     cout<<"Introduzca el orden del vector2n";cin>>m;
  31.     matrix A(n);matrix B(m);
  32.     A.suma_de_vectores (A,B);
  33.     system("pause");return 1;
  34. }
  35.  
  36.  

Sin embargo el codigo tambien compila y funciona si suprimo algunas cosas en la declaración y desarrollo de la función, es decir:

Código: C++
  1. #include <iostream>
  2. using namespace std;
  3. #define MAX_SIZE 10
  4.  
  5. class matrix{
  6.       public:
  7.              int size; double s[MAX_SIZE];
  8.              matrix (int n){
  9.                     if (n>MAX_SIZE) {cerr<<"Error tamaño demasiado grande";
  10.                     return;}
  11.                     size=n;
  12.                     for(int i=0;i<n;i++){
  13.                             cout<<"Ingresa el coef "<<i<<"n";cin>>s[i];
  14.                             }
  15.              }
  16.              ~matrix() {};
  17.              void suma_de_vectores (matrix B);
  18. };
  19.  
  20. void matrix :: suma_de_vectores (matrix A){
  21.      if(A.size!=size){cerr<<"Los vectores han de ser del mismo orden";return;}
  22.      for(int i=0;i<A.size;i++){
  23.              cout<<"suma "<<i<<" = "<<A.s[i]+s[i];}
  24.      }
  25.  
  26. int main(){
  27.     int n;int m;
  28.     cout<<"Introduzca el orden del vector1n";cin>>n;
  29.    
  30.     cout<<"Introduzca el orden del vector2n";cin>>m;
  31.     matrix A(n);matrix B(m);
  32.     A.suma_de_vectores (B);
  33.     system("pause");return 1;
  34. }
  35.  

Con lo cual me doy cuenta de que no entiendo que es lo que hago excatamente. Mi consulta es esa, si alguien me podría explicar un poco que es lo que hace el programa; por que al poner size y s toma los de la matriz A (aunque supongo que será por declarar A.suma_de_vectores(B)) sin decirselo. Para mi lo mas logico seria tomar los ultimos valores de size y s que se dieron pero los ultimos que yo sepa son los de la matriz B.

Bueno un saludo y muchas gracias de antemano

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Consulta en clases
« Respuesta #1 en: Lunes 28 de Marzo de 2011, 16:01 »
0
Primero, los atributos deben ser private y no public, sino estás violando el principio de encapsulación de la POO.

Segundo, no entiendo por qué implementas algunas funciones dentro de la clase y otras fuera. Elige uno de los métodos y síguelo, no mezcles ambos, no tiene ningún sentido.

Tercero, no hay necesidad de amontonar el cçodigo. Dejando espacios y poniendo las cosas ordenadas se obtiene un código mucho más limpio y fácil de leer. Por ejemplo:

Código: C++
  1. void matrix::suma_de_vectores(matrix A)
  2. {
  3.     if(A.size != size)
  4.     {
  5.         cerr << "Los vectores han de ser del mismo orden";  
  6.     }
  7.     else
  8.     {
  9.         for(int i=0;i<A.size;i++)
  10.         {
  11.              cout << "suma " << i << " = " << A.s[i] + s[i];
  12.         }
  13.     }
  14. }
  15.  

Yendo a tu problema:

Código: C++
  1. cout<<"suma "<<i<<" = "<<A.s[i]+s[i];}
  2.  
Aquí s no hace obligatoriamente referencia al atributo de A, sino más bien al de la clase con la que estés llamando a este método. Pero como la llamas tal que

Código: C++
  1. A.suma_de_vectores (B);
  2.  
entonces sí es A y por tanto te sumaría A.s con B.s. De todas formas para una suma te conviene mejor sobrecargar el operador + que crear un método al completo.

Saludos.

Checho360

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Re: Consulta en clases
« Respuesta #2 en: Lunes 28 de Marzo de 2011, 18:14 »
0
Hola;  lo de private en lugar de public ya lo hare que de momento estoy probando un poco como va el tema este de las clases. Lo segundo que dices (establecer unas funciones dentro de la clase y otros fuera) no lo entiendo muy bien, te refieres a que no cree la función suma fuera de la definición de clase? yo pensaba que eso era muy común y además así lo tienes más organizado. En lo de los espacios tienes toda la razón, le daré más lineas a los codigos.
Muchas gracias por contestar al problema, ahora ya lo entiendo un poco mejor, pero no entiendo muy bien eso de sobrecargar el operador, me puedes explicar?

Un saludo!!

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Consulta en clases
« Respuesta #3 en: Martes 29 de Marzo de 2011, 10:00 »
0
Cita de: "Checho360"
lo de private en lugar de public ya lo hare que de momento estoy probando un poco como va el tema este de las clases
Ok, pero que no se te olvide  :P

Cita de: "Checho360"
Lo segundo que dices (establecer unas funciones dentro de la clase y otros fuera) no lo entiendo muy bien, te refieres a que no cree la función suma fuera de la definición de clase? yo pensaba que eso era muy común y además así lo tienes más organizado.
Puedes hacerlo como quieras, pero si te fijas tienes el código del contructor dentro de la clase y el del método (que no función) suma_de_vectores fuera. Me refiero a que te decidas por fuera o dentro y te atengas a ello, no mezcles. Personalmente lo hago todo fuera y en otro fichero. La definicion de la clase en un .h, la implementación en un .cpp. Si no recuerdo mal así es como se recomienda por convención.

Cita de: "Checho360"
no entiendo muy bien eso de sobrecargar el operador, me puedes explicar?
http://www.google.es/search?q=sobrecarg ... =firefox-a

Saludos  ^_^

Checho360

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Re: Consulta en clases
« Respuesta #4 en: Martes 29 de Marzo de 2011, 13:18 »
0
Bueno, pues haciendote caso me quedo esto:

Código: C++
  1. #include <iostream>
  2. using namespace std;
  3. #define MAX_SIZE 10
  4.  
  5. class matrix{
  6.       public:
  7.              int size; double s[MAX_SIZE];
  8.              matrix (int n){
  9.                             size=test_matrix(n);
  10.              }
  11.              ~matrix() {}
  12.              int test_matrix (int a);
  13.              matrix scan_matrix (void);
  14.              matrix operator + (matrix A);
  15.              void print_matrix (void);
  16. };
  17.  
  18. int matrix :: test_matrix (int a){
  19.     if(a>MAX_SIZE){
  20.                    cerr<<"Demasiados elementosn";
  21.                    a=MAX_SIZE;
  22.                    }
  23.     return a;
  24. }
  25.  
  26. matrix matrix :: scan_matrix (void){
  27.        for(int i=0;i<size;i++){
  28.        cout<<"Ingresa el coef "<<i<<"n";cin>>s[i];
  29.        }
  30. }
  31.  
  32. matrix matrix :: operator + (matrix A){
  33.      if(A.size!=size){
  34.                       cerr<<"Los vectores han de ser del mismo orden";
  35.                       }
  36.      matrix C (A.size);
  37.      for(int i=0;i<A.size;i++){
  38.             C.s[i]=s[i]+A.s[i];}
  39.      return C;
  40.      }
  41.  
  42. void matrix :: print_matrix (void){
  43.      for(int i= 0;i<size;i++){
  44.              cout<<"Suma no "<<i<<" = "<<s[i]<<"n";
  45.              }
  46.      }
  47.  
  48. int main(){
  49.     int n;int m;
  50.     cout<<"Introduzca el orden del vector1n";
  51.     cin>>n;
  52.     matrix A(n);
  53.     A.scan_matrix();
  54.     cout<<"Introduzca el orden del vector2n";
  55.     cin>>m;
  56.     matrix B(m);
  57.     B.scan_matrix();
  58.    
  59.     matrix D = A + B;
  60.    
  61.     D.print_matrix ();
  62.    
  63.     system("pause");return 1;
  64. }
  65.  
  66.  

Lo unico lo de public y private.. es que si pongo algo en private luego no puedo acceder a ello desde otras partes del programa y entonces tendría que crear otra función para poder acceder a ella ?? es que no entiendo muy bien

Un saludo y muchísimas gracias por contestar!!

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Consulta en clases
« Respuesta #5 en: Martes 29 de Marzo de 2011, 13:24 »
0
No sé si no me explico bien o qué... Sigues mezclando implementaciones dentro y fuera de la clase.

Dentro de la clase:
Código: C++
  1. matrix (int n){
  2.                             size=test_matrix(n);
  3.              }
  4.  

Fuera de la clase:
Código: C++
  1. int matrix :: test_matrix (int a){
  2.     if(a>MAX_SIZE){
  3.                    cerr<<"Demasiados elementosn";
  4.                    a=MAX_SIZE;
  5.                    }
  6.     return a;
  7. }
  8.  
Además como te he comentado anteriormente, las llaves de cierre van a la misma altura que la sentencia que las abre, y lo que vaha dentro sólo va una tabulación más dentro, no hasta la llave (sobre todo si está al final de línea), es decir, este método anterior tiene que quedar como:

Código: C++
  1. int matrix :: test_matrix (int a){
  2.     if(a>MAX_SIZE){
  3.         cerr<<"Demasiados elementosn";
  4.         a=MAX_SIZE;
  5.     }
  6.     return a;
  7. }
  8.  
Cita de: "Checho360"
es que si pongo algo en private luego no puedo acceder a ello desde otras partes del programa y entonces tendría que crear otra función para poder acceder a ella ?? es que no entiendo muy bien

Sí, así es. Eso en POO se llaman "getters" y "setters", que modifican los atributos privados mediante lo que se puede denominar una "interfaz", así puedes controlar asuntos como validaciones, rangos, etc...

Checho360

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Re: Consulta en clases
« Respuesta #6 en: Martes 29 de Marzo de 2011, 14:47 »
0
Cita de: m0skit0
No sé si no me explico bien o qué... Sigues mezclando implementaciones dentro y fuera de la clase.

Dentro de la clase:
Código: C++
  1. matrix (int n){
  2.                             size=test_matrix(n);
  3.              }
  4.  

Fuera de la clase:
Código: C++
  1. int matrix :: test_matrix (int a){
  2.     if(a>MAX_SIZE){
  3.                    cerr<<"Demasiados elementosn";
  4.                    a=MAX_SIZE;
  5.                    }
  6.     return a;
  7. }
  8.  

Pero como hago para darle el valor correspondiente a size con un programa externo ?? la unica forma que se me ocurre es esa que tengo ahí :S ; ah y por cierto esta tarde me pondré un poco con el private a ver que tal :P

Un saludo!!

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Consulta en clases
« Respuesta #7 en: Martes 29 de Marzo de 2011, 16:19 »
0
Yo no te digo que lo estés haciendo mal en cuanto a la funcionalidad, sino a la legibilidad y coherencia: que pongas la implementación del constructor fuera de la clase también  :P

Código: C++
  1. class matrix
  2. {
  3. public:
  4.     int size;
  5.     double s[MAX_SIZE];
  6.  
  7.     matrix (int n);
  8.     ~matrix();
  9.  
  10.     int test_matrix (int a);
  11.     matrix scan_matrix (void);
  12.     matrix operator + (matrix A);
  13.     void print_matrix (void);
  14. };
  15.  
  16. matrix::matrix(int n)
  17. {
  18.     size=test_matrix(n);
  19. }
  20.  
En cuanto a lo del private, también deben ser privados los métodos que no vayan a ser usados por clases externas.

Checho360

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Re: Consulta en clases
« Respuesta #8 en: Martes 29 de Marzo de 2011, 16:51 »
0
Bueno pues muchas gracias, ya cambio yo ahora como tu dices. Por cierto, tengo por ahí otro post  con un error a la hora de poner el constructor copia, quizas me podrias echar un cable ejejje :P

Un saludo!!

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Consulta en clases
« Respuesta #9 en: Martes 29 de Marzo de 2011, 16:54 »
0
En tu hilo dices que ya lo has corregido  &lt;_&lt;

Checho360

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Re: Consulta en clases
« Respuesta #10 en: Martes 29 de Marzo de 2011, 17:03 »
0
No no pero me referia a que había puesto un código equivocado; la duda es del código acutal jeje