Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: skorpion32 en 25 Julio 2011, 22:38 pm



Título: [C++]¿Comunicacion entre clases?
Publicado por: skorpion32 en 25 Julio 2011, 22:38 pm
Saludos espero me puedan ayudar

Verán estoy aprendiendo C++ y tengo la siguente duda

Quiero comunicar una una clase con otra (estas clases estan en archivos distintos), ¿para poder hacerlo se usan los archivos de cabecera?

Vi que había que definir prototipos en un archivo.h y en otro archivo.cpp definir dichos métodos como tal, que correspondan con el archivo de cabecera.

Despues para poder usar los metodos de esa clase en otra, bastaria con incluir el #include "archivo.h" y ya podria acceder a sus metodos y atributos con un objeto de dicha clase , ¿no?

Mi duda es si esto es "Valido" o correcto, yo lo hago así , pero me entró la duda.

Saludos!!
_________________________
En java esto bastaba con incluir el mismo paquete y ya podia instanciar a la otra clase


Título: Re: [C++]¿Comunicacion entre clases?
Publicado por: Queta en 26 Julio 2011, 00:45 am
http://www.cplusplus.com/doc/tutorial/inheritance/ (http://www.cplusplus.com/doc/tutorial/inheritance/)


Título: Re: [C++]¿Comunicacion entre clases?
Publicado por: Acermax en 27 Julio 2011, 15:53 pm
Creo que skorpion no se refiere a la amistad entre clases, sino simplemente a usarla.

Si es así, tal y como lo haces y dices es correcto.


Título: Re: [C++]¿Comunicacion entre clases?
Publicado por: kurohige en 28 Julio 2011, 20:49 pm
http://www.cplusplus.com/doc/tutorial/inheritance/

:)


Título: Re: [C++]¿Comunicacion entre clases?
Publicado por: Queta en 28 Julio 2011, 21:54 pm
Convendría leer los hilos antes de comentar ;).


Título: Re: [C++]¿Comunicacion entre clases?
Publicado por: skorpion32 en 29 Julio 2011, 11:30 am
Sii esos son metodos validos , pero van mas alla de lo que planteo en mi duda inicial , si yo tengo DOS ARCHIVOS DISTINTOS , osea un claseuno.cpp y otro clasedos.cpp , estas no se conoceran , lo unico que io querria hacer es generar un objeto de la otra clase y usarlo, a menos que declare sus prototipos de una en un por ej . clasedos.h , y este incluirlo . Aparte de la relacion de estas dos clases. mi duda es si ese metodo es valido ¿?


Título: Re: [C++]¿Comunicacion entre clases?
Publicado por: Queta en 29 Julio 2011, 14:39 pm
Sí. Mira este ejemplo que acabo de hacer, a ver si es lo que realmente quieres:

main.cpp

Código
  1. #include <cstdio>
  2. #include "clase.h"
  3.  
  4. int main()
  5. {
  6. clase1 _clase1;
  7. clase2 _clase2;
  8.  
  9. printf("clase1: %d\n", _clase1.suma(5, 5));
  10.  
  11. printf("clase2: %d\n", _clase2.resta(1));
  12.  
  13. getchar();
  14.  
  15. return 0;
  16. }

clase.h

Código
  1. class clase1
  2. {
  3. public:
  4. int suma(int, int);
  5. };
  6.  
  7. class clase2
  8. {
  9. public:
  10. int resta(int);
  11. };

clase1.cpp

Código
  1. #include "clase.h"
  2.  
  3. int clase1::suma(int a, int b)
  4. {
  5. return a + b;
  6. }

clase2.cpp

Código
  1. #include "clase.h"
  2.  
  3. clase1 _clase1;
  4.  
  5. int clase2::resta(int a)
  6. {
  7. int numero = _clase1.suma(2, 3);
  8.  
  9. return numero - a;
  10. }


Título: Re: [C++]¿Comunicacion entre clases?
Publicado por: Foxy Rider en 29 Julio 2011, 20:23 pm
¿ Podrías describir más que es lo que querés hacer ? Me llegan múltiples formas de resolverlo a la cabeza, pero cada una tiene su pro y contra, y están pensadas para resolver distintos problemas ...

Saludos.

P.S: Uff, hace milenios que no entro a este subforo ! x'D


Título: Re: [C++]¿Comunicacion entre clases?
Publicado por: skorpion32 en 30 Julio 2011, 23:01 pm
Gracias muchachos , ya me quedo claro  :D


Título: Re: [C++]¿Comunicacion entre clases?
Publicado por: PiroskY en 31 Julio 2011, 09:37 am
la verdad que me parece una forma horrenda y engorrosa eso de poner la cabecera en un archivo y desarrollarlas en otro

Yo hago un .h para cada clase, y debajo de la clase desarrollo sus métodos
Y si los métodos son extremadamente cortos, los desarrollo ahí mismo.


Respondo lo que creo es tu duda:

Supongo que si te aventuraste con las clases, ya pasaste por las estructuras,
De ser así, te comento, el principal cambio es el encapsulamiento.
(o es lo que importa de momento, según interpreto tu duda)

Vos con estructuras podes acceder a sus atributos simplemente con estructura.atributo

Ahora, si estas usando clases como corresponde, todos tus atributos van a ser privados y solo vas a poder acceder a ellos mediante métodos de esa clase (los cuales, obviamente, tienen que ser públicos)
Entonces, si tu clase tiene un atributo Dato1, vos vas a tener que mediante un método, devolver ese dato o un puntero al mismo
Y si lo vas a querer modificar, vas a tener que crear un método que reciba el nuevo valor de Dato1 y reemplazar al anterior

Acá pongo un ejemplito:

Main
Código
  1. #include <iostream>
  2. #include <string.h>
  3. #include "Class.h"
  4.  
  5. using namespace std;
  6.  
  7. int main()
  8. {
  9.    clsPersona persona1;
  10.  
  11.    cout << "Ingrese la edad" << endl;
  12.    persona1.setEdad();
  13.  
  14.    cout << "Ingrese el nombre" << endl;
  15.    persona1.setNombre();
  16.  
  17.    cout << endl;
  18.    cout << persona1.getNombre() << endl;
  19.    cout << persona1.getEdad() << endl;
  20.  
  21. return 0;
  22. }

Class.h
Código
  1. using namespace std;
  2.  
  3. class clsPersona
  4. {
  5.    private:
  6.        char nombre[30];
  7.        int edad;
  8.  
  9.    public:
  10.        char* getNombre(){return this->nombre;};
  11.        int getEdad(){return this->edad;};
  12.        void setNombre(){cin >> this->nombre;};
  13.        void setEdad(){cin >> this->edad;};
  14. };

Por otro lado:

"Después para poder usar los metodos de esa clase en otra, bastaria con incluir el #include "archivo.h" y ya podria acceder a sus metodos y atributos con un objeto de dicha clase , ¿no?"

Me genera mucha intriga lo que dijiste ahí.
Hablas de usar los métodos de una clase para otra clase?

"podría acceder a sus atributos con un objeto de dicha clase".
Por las dudas te aclaro, cuando vos instancias una clase, estas creando un "paquete" de sus atributos, no es que la clase tiene sus atributos y vos accedes a ellos mediante el objeto.
Vos podes tener muchos objetos de una misma clase, y cada uno tiene su atributo nombre por ejemplo, cada uno independiente del otro.

espero algo de esto te sirva, y no haber escrito tanto al dope.

saludos


Título: Re: [C++]¿Comunicacion entre clases?
Publicado por: Foxy Rider en 31 Julio 2011, 17:19 pm
Citar
la verdad que me parece una forma horrenda y engorrosa eso de poner la cabecera en un archivo y desarrollarlas en otro

Eso es por que todavía no separaste mentalmente Interface de Implementación ... ^^

Lo que me parece un asco es lo que hizo Queta, de meter todo en un .h (cada clase tiene su propia interface, y vá para su respectivo .h/.hpp/.comoquieras) y en el cpp declarar la variable en el namespace global es también una pésima práctica (quiebra la encapsulación ... si lo usa clase2, ponelo dentro de la clase ...  si necesitás acceder a algo de forma global e instanciarlo una vez, quizáaaa ... QUIZÁ el patrón singleton pueda ser de ayuda ;) )

Citar
Yo hago un .h para cada clase, y debajo de la clase desarrollo sus métodos
Y si los métodos son extremadamente cortos, los desarrollo ahí mismo.

Hacelo en un proyecto grande y mirá cómo colisiona el compilador cuando encuentre símbolos re-definidos ...

Saludos.

P.S: Pablo, no mezcles lenguajes .... es mala práctica

P.S2: Para los ejemplos el "using namespace std" está bien, pero en la práctica, hay que ver si es mejor usarlo en un ámbito más local.... depende, depende ... además en el .h no incluiste el iostream antes .. y si un .cpp llama a ese .h sin incluir antes iostream, estás en problemas.


Título: Re: [C++]¿Comunicacion entre clases?
Publicado por: PiroskY en 1 Agosto 2011, 20:19 pm
Perdon por el Off,  pero es una duda que me interesa sacarme:

P.S: Pablo, no mezcles lenguajes .... es mala práctica
Realmente no se a que te referis, alguien me dice?

PD:
P.S2: Para los ejemplos el "using namespace std" está bien, pero en la práctica, hay que ver si es mejor usarlo en un ámbito más local....
exactamente, era un ejemplito boludo nomas, no me iba a poner a hacer algo elaborado, cuando la duda (creo yo) era otra

en el .h no incluiste el iostream antes .. y si un .cpp llama a ese .h sin incluir antes iostream, estás en problemas.
hay un único cpp en este proyecto, y ese incluye la iostream :P


Título: Re: [C++]¿Comunicacion entre clases?
Publicado por: Foxy Rider en 1 Agosto 2011, 21:44 pm
Citar
Realmente no se a que te referis, alguien me dice?

El lenguaje que estás usando es en inglés, vos estás usando variables, clases y métodos con mezclas en español.

Citar
hay un único cpp en este proyecto, y ese incluye la iostream

Sí, por eso lo señalé, en este caso está bien, es mala práctica, pero está bien (compila)
Pero en otro entorno, como estás usando iostream dentro del .h (debería ser en el .cpp), ese .h depende de iostream y deberías incluírlo ahí ... y si main.cpp no incluye iostream ? no se declaran los símbolos que Class.h necesita. ( std::cin )
No sé si me explico.

Y ahora noté, además ... que string.h (cstring) no lo andás usando (la versión de las libs de c++ es "string") -> http://www.cplusplus.com/reference/clibrary/cstring/

Saludos.

P.S: perdón si soy muy estricto


Título: Re: [C++]¿Comunicacion entre clases?
Publicado por: PiroskY en 1 Agosto 2011, 21:53 pm
ajajajaj lenguaje en cuanto a idioma

creí que usaba algo de C sin darme cuenta

y si, te entiendo lo del iostream, pero por algo taaaan simple.. :P

mira vos, no sabia eso de la diferencia entre string.h y string, eso voy a tenerlo en cuenta
Y si, lo unclui porque al principio nombre se iba a ingresar con cin.getline, pero me arrepentí a ultimo momento :P

gracias por las correcciones :)

/off


Título: Re: [C++]¿Comunicacion entre clases?
Publicado por: [L]ord [R]NA en 2 Agosto 2011, 01:24 am
Busca sobre Semaphores, Signals, Mutex e incluso Shared Files, Shared Memory o Pipes.