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
http://www.cplusplus.com/doc/tutorial/inheritance/ (http://www.cplusplus.com/doc/tutorial/inheritance/)
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.
http://www.cplusplus.com/doc/tutorial/inheritance/
:)
Convendría leer los hilos antes de comentar ;).
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 ¿?
Sí. Mira este ejemplo que acabo de hacer, a ver si es lo que realmente quieres:
main.cpp
#include <cstdio>
#include "clase.h"
int main()
{
clase1 _clase1;
clase2 _clase2;
printf("clase1: %d\n", _clase1.suma(5, 5));
printf("clase2: %d\n", _clase2.resta(1));
getchar();
return 0;
}
clase.h
class clase1
{
public:
int suma(int, int);
};
class clase2
{
public:
int resta(int);
};
clase1.cpp
#include "clase.h"
int clase1::suma(int a, int b)
{
return a + b;
}
clase2.cpp
#include "clase.h"
clase1 _clase1;
int clase2::resta(int a)
{
int numero = _clase1.suma(2, 3);
return numero - a;
}
¿ 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
Gracias muchachos , ya me quedo claro :D
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
#include <iostream>
#include <string.h>
#include "Class.h"
using namespace std;
int main()
{
clsPersona persona1;
cout << "Ingrese la edad" << endl;
persona1.setEdad();
cout << "Ingrese el nombre" << endl;
persona1.setNombre();
cout << endl;
cout << persona1.getNombre() << endl;
cout << persona1.getEdad() << endl;
return 0;
}
Class.h
using namespace std;
class clsPersona
{
private:
char nombre[30];
int edad;
public:
char* getNombre(){return this->nombre;};
int getEdad(){return this->edad;};
void setNombre(){cin >> this->nombre;};
void setEdad(){cin >> this->edad;};
};
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
Citarla 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.
Perdon por el Off, pero es una duda que me interesa sacarme:
Cita de: vertex@Symphony en 31 Julio 2011, 17:19 PM
P.S: Pablo, no mezcles lenguajes .... es mala práctica
Realmente no se a que te referis, alguien me dice?
PD:
Cita de: vertex@Symphony en 31 Julio 2011, 17:19 PM
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
Cita de: vertex@Symphony en 31 Julio 2011, 17:19 PM
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
CitarRealmente 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.
Citarhay 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
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
Busca sobre Semaphores, Signals, Mutex e incluso Shared Files, Shared Memory o Pipes.