Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problema Con Includes Y Herencia

Iniciado por Sacrifai, 03 de Octubre de 2004, 02:26:24 AM

« anterior - próximo »

Sacrifai

 Tengo una clase(en un archivo aparte) y otras tres clases ( que tambien están es sus respectivos ficheros ). Resulta que estas tres últimas heredarán los miembros de la primera. El problema, por muy tonto que parezca, me trae de cabeza. Se trata de los includes. Resulta que por huevos tengo que incluir el include de la primera clase en cada archivo ( en los archivos de las tres clases que heredarán ). Pero resulta que salta el compilador y me dice que estoy redefiniendo esa clase. He probado mil cosas, poner el include solo en el main, ponerlo solo en un fichero... pero nada, me dice que en los otros no está declarado. Para más inri, el el DEV-CPP si me deja compilar, pero una vez si una vez no, es decir, tengo que quitar de los tres ficheros el include y da error, luego lo pongo y compila, y luego compilo de nuevo y nada  (nooo) .¡Ayuda!

Muchas Gracias  (ole) .  

kbks

 Este es mi primer mensage en el foro aunque ya llevo teimpo entrando asi que aprobecho para saludar a todos.

En cuanto a tu problema no se si esto lo solucionara ya que soy un poco novatillo. Incluye esto en el .h:


#ifndef _ARCHIVO_H
#define _ARCHIVO_H

  ...codigo del .h...


#endif






Sacrifai

 Lo siento pero soy un poco torpe. Se supone que archivo.h es el fichero de la clase con los miembros que las otras heredarán ¿no?. ¿ Influye que yo esté usando .CPP ?

PD:¡Bienvenido!

Abc7

 mmmmm.... podes crear otro .h (por ejemplo clases.h) definiendo las clases.. algo asi
#include <clasebase.h>
#include <clasederivada1.h>
#include <clasederivada2.h>
#include <clasederivada3.h>
#include <clasebase.cpp>
#include <clasederivada1.cpp>
#include <clasederivada2.cpp>
#include <clasederivada3.cpp>
y en los archivos .cpp de las clases (clasederivada1.cpp, etc) NO pongas los includes a los .h (clasederivada.h, etc)... y en el main.cpp o el archivo .cpp donde necesites las clases, haces
#include <clases.h> y podes usar las clases =)
y estas usando DEV-CPP mas q nada o solo lo usaste para probar? xq si usas vc++ el ifndef no sirve (al menos a mi no :()
si no se entendio, hacemelo saber :D

ShAq

 Buenas,
tal como dice kbks (bienvenido!), deberias poner lo que el dice en
todos los .h de las clases.
Seguramente asi se arreglará tu problema.

CitarLo siento pero soy un poco torpe. Se supone que archivo.h es el fichero de la clase con los miembros que las otras heredarán ¿no?. ¿ Influye que yo esté usando .CPP ?

Pues no entiendo muy bien esa pregunta...
archivo.h es un nombre generico, deberias poner
_(NOMBRE DEL FICHERO DE LA CLASE)_H_ en las dos
primeras lineas, no quiere decir que nombres al fichero como archivo.h

Y lo de que si influye ke estes usando cpp..., no se si has definido las clases
en dos ficheros, como deberia ser, para claridad.
En el .h declaras metodos y variables miembro, y en el .cpp defines los metodos.

Espero haberte ayudado en algo, a estas horas deberia estar sobando  :huh:  

ShAq

 Vaya, te has adelantado,:P
Pues en vc++ creo que si funciona el #ifndef,
no obstante puedes usar #pragma once al principio
del .h, y punto,  (ole)  

Abc7

 nose.. pero por algo vc++ en vez d usar eso usa algo como
#if !defined(AFX_NOMBREARCHIVO_H__6FDB5A08_80E9_43A0_A9AB_FF0990C36537__INCLUDED_)
#define AFX_NOMBREARCHIVO_H__6FDB5A08_80E9_43A0_A9AB_FF0990C36537__INCLUDED_

/* Body Code */

#endif // !defined(AFX_NOMBREARCHIVO_H__6FDB5A08_80E9_43A0_A9AB_FF0990C36537__INCLUDED_)

asi si me funciona, con #ifndef nu :(

Abc7

 a proposito.. esto no iria en General Prog.? nose.. la verdad pregunto xq soy nuevo aca =P asi se bien donde postear las cosas

Sacrifai

 
Cita de: "Abc7"a proposito.. esto no iria en General Prog.? nose.. la verdad pregunto xq soy nuevo aca =P asi se bien donde postear las cosas
Aqui por lo visto se suele usar el general para estas cosas, o al menos eso es lo que he visto (ole) , pero vaya, si no os gusta que esté aquí el post, administradores al ataque XDD.

Respecto al tema, muchas gracias, ya lo resolví con lo del #pragma once  (ole)  (ole)  (ole) .

ethernet

 Creo que #pragma once es específico de vc++ (no estoy seguro) y es mucho más portable usar los ifdef's. Si no sabeis usarlo parad 5 minutos a pensar como funciona:

#ifndef  _MICABECERA_H_  // Si no esta definida lña variable _MICABECERA_H_ entro
#define _MICABECERA_H_  // defino una varibale llamada _MICABECERA_H_

//codigo del doom3 + unreal 4 + GTA10 + quake5

#endif // fin del indef


Cuando entra la primera vez  a la cabecera (cuando la compila por primera vez)  no estará definida la variable _MICABECERA_H_ y por lo tanto entrará dentro del bucle. Al entrar ésta será definida y la siguiete vez que trate de compilar esa cabecera ya estará definida y el ifndef hará que no entre al código.

La conclusión de todo esto es que trateis de pescar los peces no que os los pesquen
saludos

Sacrifai

Cita de: "ethernet"La conclusión de todo esto es que trateis de pescar los peces no que os los pesquen
Pero de tanto pescar, las redes de la paciencia se pueden romper  (uoh) . Muchas gracias por la explicación.

BeRSeRKeR

Cita de: "ethernet"Creo que #pragma once es específico de vc++ (no estoy seguro) y es mucho más portable usar los ifdef's.
El Dev-Cpp sí soporta el #pragma once pero te suelta un warning diciéndote que es obsoleto de forma que sí, mejor utilizar el ifndef/define.

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.