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

Archivos de cabezera? interfaces?

Estas en el tema de Archivos de cabezera? interfaces? en el foro de C/C++ en Foros del Web. Saludos amigos de foros del web tengo una duda acerca de c++ , no llevo mucho tiempo con el , de mano ya sabia C ...
  #1 (permalink)  
Antiguo 23/07/2011, 21:24
 
Fecha de Ingreso: julio-2011
Mensajes: 6
Antigüedad: 12 años, 9 meses
Puntos: 1
Busqueda Archivos de cabezera? interfaces?

Saludos amigos de foros del web

tengo una duda acerca de c++ , no llevo mucho tiempo con el , de mano ya sabia C y java por un lado, asi que me motivé por aprenderlo debido a similitudes con estos dos lenguajes.

Mi problema es que por ejemplo si yo tenia en java por decir un ejemplo.
Dos archivos , uno main.java (que contenga el main ) y otro usuario.java(que contenga datos de un usuario) , siendo estos dos archivos de el mismo paquete bastaba con que en el main crear un objeto e ir llamando a los métodos de la clase usuario.java según se requieran.

Ahora bien , como aprendiz de C++ mi intencion como buen lenguaje orientado a objetos es no hacer todo en un solo archivo con el main todo junto y separar mis clases, cada una en un archivo.cpp distinto (incluyendo el main) y desde este ir conduciendo la lógica del programa, pero he aqui mi duda

Para este proposito , si quiero hacer algo como lo expliqué en el ejemplo de java, ¿la unica forma es mediante los archivos de cabezera? , creando un usuario.h y de ahi definiendo su respectivo usuario.cpp con la definicion de sus metodos , no? ¿No puedo definir los metodos en el mismo usuario.h , o a fuerzas tengo que hacer otro usuario.cpp solo para definirlos? ¿Cual seria la forma correcta de hacerlo?

Este procedimiento se parece a lo llamado interfaces en java , debido a su limitacion por tener herencia simple , ¿acá se usan para comunicar las clases entre ellas? y C++ al tener herencia multiple no necesita usar el concepto de interfaces como en java. ¿sino que para comunicarse entre distintos .cpp se usarian los archivos de cabezera, volviendo a mi pregunta?

Espero me puedan ayudar !!
Desde ya muchas gracias

PD: si ya sé ! me complico solo xD

Saludos

Última edición por skorpion32; 23/07/2011 a las 22:23
  #2 (permalink)  
Antiguo 24/07/2011, 12:14
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Respuesta: Archivos de cabezera? interfaces?

Bueno. En si todo depende de tus habitos de programacion, de como este acostumbrado.

La logica que tu tienes en mente es muy correcta.
Tener el main en un archivo main.cpp y tener cada clase en un archivo diferente.

Puedes, al igual que en Java, implementar la clase dentro del archivo de cabecera.
Hasta donde recuerdo, se hace de la misma manera que en Java.

Sin embargo, yo he visto que una de las mmm convenciones mas usadas es, definir la clase en una cabecera (.h) y luego implementarla en un (.cpp). Eso es por lo general lo mas usual. Mas que nada porque permite la facil identificacion de los metodos, y ya si estas interesado en ver la implementacion pues entonces vas al cpp.

Ahora, con respecto a lo de la herencia. Es un cosa totalmente aparte de como se implementan las clases.

C++ puede manejar herencia simple. De hecho hasta donde recuerdo, todo tipo de relaciones entre clases existentes en Java, tiene su equivalente en C++.
Esto hace posible que programes en C++ al estilo Java, con algunas excepciones, minimas.

Igual, hasta donde se, C++ tiene varios metodos para comunicarse entre clases, uno de ellos es la herencia. Asi que por ese punto no debes tener ningun problema.

Espero haberte aclarado tus dudas.

Saludos
  #3 (permalink)  
Antiguo 24/07/2011, 15:56
 
Fecha de Ingreso: julio-2011
Mensajes: 6
Antigüedad: 12 años, 9 meses
Puntos: 1
Respuesta: Archivos de cabezera? interfaces?

Vale ya me queda mas claro !!

En resumen , ¿para poder usar metodos de otra clase en una existente es valido incluir el archivo de cabecera de la cual quiero llamar y de ahi crear objetos e instanciar?
Gracias!
  #4 (permalink)  
Antiguo 24/07/2011, 20:18
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Archivos de cabezera? interfaces?

Poruqe no se implementan archivos en un .h?? Debido a que los .h se usan con la instruccion include y esa es muy ususal de incluir en muchos archivos .h. Si estuviese implementada en este archivo el compilador nos daria montones de errores que la clase esta definida varias veces.

Lo que se logra con un .h con solo definiciones es tener un nombre para las cosas. Asi el compilador sabe que en un futuro de la compilacion va a existir una clase, funcion, variables con ese nombre. Asi el compilaor no se preocupa y deja un especie de vacio para despues completar con la funcion.

Por eso en los archivos de cabeceras va simplemente las cabezas de las cosas jeje
Espero ser claro. No es un tema muy simple, a mi me llevo tiempo comprender bien. Pero una vez que te acostumbras y notas como se manejan los compiladores resulta util. Saludos
  #5 (permalink)  
Antiguo 24/07/2011, 20:50
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Respuesta: Archivos de cabezera? interfaces?

Cita:
Iniciado por sam90 Ver Mensaje
Poruqe no se implementan archivos en un .h?? Debido a que los .h se usan con la instruccion include y esa es muy ususal de incluir en muchos archivos .h. Si estuviese implementada en este archivo el compilador nos daria montones de errores que la clase esta definida varias veces.

Lo que se logra con un .h con solo definiciones es tener un nombre para las cosas. Asi el compilador sabe que en un futuro de la compilacion va a existir una clase, funcion, variables con ese nombre. Asi el compilaor no se preocupa y deja un especie de vacio para despues completar con la funcion.

Por eso en los archivos de cabeceras va simplemente las cabezas de las cosas jeje
Espero ser claro. No es un tema muy simple, a mi me llevo tiempo comprender bien. Pero una vez que te acostumbras y notas como se manejan los compiladores resulta util. Saludos
Bueno, de hecho este es un problema taan comun en C++ no solo con clases sino con todo tipo de definicion de variables que es ya costumbre usar


#ifndef NOMBRE_CABECERA
#define NOMBRE_CABECERA

....codigo....

#endif


Esto hace que el archivo se incluya solo una vez, sin importar cuantos includes tengas.

Saludos
  #6 (permalink)  
Antiguo 25/07/2011, 10:58
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Archivos de cabezera? interfaces?

No estas en todo lo cierto. Mira este ejemplo:
Archivo "t.c"
Código C:
Ver original
  1. #include "t.h"
  2. int main ()
  3.  
  4. {
  5.     hola();
  6.    
  7. }

archivo "tt.c"
Código C:
Ver original
  1. #include "t.h"
  2. int main2 ()
  3.  
  4. {
  5.     hola();
  6.    
  7. }

archivo "t.h"
Código C:
Ver original
  1. #ifndef NOMBRE_CABECERA
  2. #define NOMBRE_CABECERA
  3.  
  4. int hola()
  5. {
  6. int p = 1;
  7.  
  8. }
  9.  
  10. #endif

Comando para compilar: gcc t.c tt.c
Respuesta del compilador:
Cita:
/tmp/ccREYCK2.o: In function `hola':
tt.c:(.text+0x0): multiple definition of `hola'
/tmp/ccunxPRr.o:t.c:(.text+0x0): first defined here
collect2: ld returned 1 exit status
Que paso? Sencillo cada archivo cpp tiene su ambiente de definiciones. Por mas que el include de t.c haya definido NOMBRE_CABECERA, el archivo tt.c ni se entero de eso, asi que la vuelve a definir. Como estabamos hablando de una implementacion y no solo de una definicion, el resultado es, dos veces la misma funcion, Y eso es lo que nos dice el compilador multiple definiciones para la funcion hola.

Ese truco de los define sirve para evitar includes en ciclo o que por ejemplo se tengo un archivo "comun.h" y dos archivos que llamen a "comun.h" (a.h y b.h). Si en un archivo .c incluimos a "a.h" y a "b.h", ahi si estamos evitando la doble definicion.


Saludos,
  #7 (permalink)  
Antiguo 25/07/2011, 11:28
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Respuesta: Archivos de cabezera? interfaces?

Buen punto.
He ahi la razon por la cual no es bueno definir metodos o funciones dentro del archivo de cabecera

Saludos
  #8 (permalink)  
Antiguo 25/07/2011, 12:40
 
Fecha de Ingreso: julio-2011
Mensajes: 6
Antigüedad: 12 años, 9 meses
Puntos: 1
Respuesta: Archivos de cabezera? interfaces?

Vale pues, defino prototipos en cabecera y defino en un cpp con su mismo nombre es lo ideal.
de ahi en cualquier clase que quiera usar dichos metodos , basta con incluir su respectivo
#include "clase.h" y voilá tendré sus metodos y atributos disponibles ... o bueno asi lo tengo claro.
Es la forma apropiada de comunicar clases , no?

Gracias a todos por responder!

Última edición por skorpion32; 25/07/2011 a las 12:51
  #9 (permalink)  
Antiguo 25/07/2011, 19:43
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Archivos de cabezera? interfaces?

Una correccion,

Es completamente posible tener la implementacion de metodos dentro de la declaracion de una clase.
El compilador no tendrá problema en que 2 modulos distintos hagan #include de un archivo .h que tenga una clase con algún método implementado dentro (e.g. la STL).

Distinto es tener una función con scope global. En ese caso, si aun se desea poner una función dentro de un archivo .h, es necesario agregar que ella sea "static", para que no sea exportada afuera de cada modulo y aparezca el error de link que se mostró previamente.

El no poner código en los archivos .h, creo yo, se debe a que presenta una desventaja pues existe una enorme pérdida de tiempo respecto a separar los prototipos + implementación en archivo .cpp, debido a que cada vez que se haga #include, se chequeará / compilará la implementación, y eventualmente se haga el mismo proceso varias veces. Mover la implementación fuera evitará esa repetición.

Algunos compiladores tienen la habilidad de precompilar los archivos .h y no seria tan notoria la repeticion de ese proceso, pero requerira espacio en disco para guardar archivos pre-compilados.

El compilar es intensivo en recursos, no quieres hacerlo a cada rato o hacerlo con todo el código todas las veces, especialmente si no has cambiado nada.

Etiquetas: programa
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 16:17.