Programación General > C/C++

 Consulta en clases

(1/3) > >>

Checho360:
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++ ---#include <iostream>using namespace std;#define MAX_SIZE 10 class matrix{      public:             int size; double s[MAX_SIZE];             matrix (int n){                    if (n>MAX_SIZE) {cerr<<"Error tamaño demasiado grande";                    return;}                    size=n;                    for(int i=0;i<n;i++){                            cout<<"Ingresa el coef "<<i<<"n";cin>>s[i];                            }             }             ~matrix() {};             void suma_de_vectores (matrix A,matrix B);}; void matrix :: suma_de_vectores (matrix A, matrix B){     if(A.size!=size){cerr<<"Los vectores han de ser del mismo orden";return;}     for(int i=0;i<A.size;i++){             cout<<"suma "<<i<<" = "<<A.s[i]+s[i];}     } int main(){    int n;int m;    cout<<"Introduzca el orden del vector1n";cin>>n;        cout<<"Introduzca el orden del vector2n";cin>>m;    matrix A(n);matrix B(m);    A.suma_de_vectores (A,B);    system("pause");return 1;}  
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++ ---#include <iostream>using namespace std;#define MAX_SIZE 10 class matrix{      public:             int size; double s[MAX_SIZE];             matrix (int n){                    if (n>MAX_SIZE) {cerr<<"Error tamaño demasiado grande";                    return;}                    size=n;                    for(int i=0;i<n;i++){                            cout<<"Ingresa el coef "<<i<<"n";cin>>s[i];                            }             }             ~matrix() {};             void suma_de_vectores (matrix B);}; void matrix :: suma_de_vectores (matrix A){     if(A.size!=size){cerr<<"Los vectores han de ser del mismo orden";return;}     for(int i=0;i<A.size;i++){             cout<<"suma "<<i<<" = "<<A.s[i]+s[i];}     } int main(){    int n;int m;    cout<<"Introduzca el orden del vector1n";cin>>n;        cout<<"Introduzca el orden del vector2n";cin>>m;    matrix A(n);matrix B(m);    A.suma_de_vectores (B);    system("pause");return 1;} 
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:
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++ ---void matrix::suma_de_vectores(matrix A){    if(A.size != size)    {        cerr << "Los vectores han de ser del mismo orden";      }    else    {        for(int i=0;i<A.size;i++)        {             cout << "suma " << i << " = " << A.s[i] + s[i];        }    }} 
Yendo a tu problema:


--- Código: C++ ---cout<<"suma "<<i<<" = "<<A.s[i]+s[i];} 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++ ---A.suma_de_vectores (B); 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:
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:

--- 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
--- Fin de la cita ---
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.
--- Fin de la cita ---
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?
--- Fin de la cita ---
http://www.google.es/search?q=sobrecarg ... =firefox-a

Saludos  ^_^

Checho360:
Bueno, pues haciendote caso me quedo esto:


--- Código: C++ ---#include <iostream>using namespace std;#define MAX_SIZE 10 class matrix{      public:             int size; double s[MAX_SIZE];             matrix (int n){                            size=test_matrix(n);             }             ~matrix() {}             int test_matrix (int a);             matrix scan_matrix (void);             matrix operator + (matrix A);             void print_matrix (void);}; int matrix :: test_matrix (int a){    if(a>MAX_SIZE){                   cerr<<"Demasiados elementosn";                   a=MAX_SIZE;                   }    return a;} matrix matrix :: scan_matrix (void){       for(int i=0;i<size;i++){       cout<<"Ingresa el coef "<<i<<"n";cin>>s[i];       }} matrix matrix :: operator + (matrix A){     if(A.size!=size){                      cerr<<"Los vectores han de ser del mismo orden";                      }     matrix C (A.size);     for(int i=0;i<A.size;i++){            C.s[i]=s[i]+A.s[i];}     return C;     } void matrix :: print_matrix (void){     for(int i= 0;i<size;i++){             cout<<"Suma no "<<i<<" = "<<s[i]<<"n";             }     } int main(){    int n;int m;    cout<<"Introduzca el orden del vector1n";    cin>>n;    matrix A(n);    A.scan_matrix();    cout<<"Introduzca el orden del vector2n";    cin>>m;    matrix B(m);    B.scan_matrix();        matrix D = A + B;        D.print_matrix ();        system("pause");return 1;}  
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!!

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa