elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema con #includes
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Problema con #includes  (Leído 4,266 veces)
<<<-Basura->>>


Desconectado Desconectado

Mensajes: 388



Ver Perfil
Problema con #includes
« en: 4 Junio 2013, 06:35 am »

Buenas Tengo 2 clases que me están dando problemas y es por el modo de declaración, aun no se como resolverlo si alguien sabe por favor ayude me...

Esto tiene un archivo
Código
  1. #include "Conectividad.hpp"
  2.  
  3. #ifndef _SOCKET_CPP
  4. #define _SOCKET_CPP
  5. class Socket{
  6. private:
  7. Host *host;
  8. public:
  9. Receiver *receiver;
  10. Sender *sender;
  11. Conectividad *conectividad;
  12. public:
  13. Socket(Host*);
  14. };
  15.  
  16. Socket::Socket(Host*pHost){
  17. this->host = pHost;
  18. this->receiver = new Receiver(this->host);
  19. this->sender = new Sender(this->host);
  20. this->conectividad = new Conectividad(this->host);
  21. }
  22.  

Esto tiene el otro archivo
Código
  1.  
  2. #ifndef _CONECTIVIDAD_CPP
  3. #define _CONECTIVIDAD_CPP
  4.  
  5. class Socket;
  6.  
  7. class Conectividad {
  8. private:
  9. Host *host;
  10. public:
  11. Conectividad(Host*,int);
  12.  
  13. bool Bind();
  14. bool Listen(int);
  15. Host Accept();
  16. bool Connect();
  17.  
  18. Socket Acceptar();
  19. };
  20.  
  21. Socket Conectividad::Accept(){
  22. //Variables
  23. int addrlen = sizeof(sockaddr_in); // Tamaño
  24. Host HostEstructura; // Return
  25.  
  26. // Acepta la Conexion
  27. HostEstructura.setSocket( accept(host->getSocket(), (sockaddr*)HostRetorno.getSockAddress(),  (socklen_t*)&addrlen ) );
  28.  
  29. Socket SocketRetorno(HostEstructura);
  30. return HostEstructura;
  31. }
  32. #endif
  33.  
El Error es este:
Citar
does not name a type error in C++

Ahora si, El problema se da en el segundo archivo, el primero tiene todo bien pero cuando intento implementar el método Accept y que me retorne un Socket me tira ese error... también es porque intento llamar el constructor de Socket si haber implementado la clase completa pero es que no puedo hacer un include de Socket dentro del segundo archivo ya que me rebota, porque ya hice un #include "Conectividad.hpp" en Socket y no se porque sucede....

Alguna sugerencia??


En línea

<<<--Basura-->>>
amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Problema con #includes
« Respuesta #1 en: 4 Junio 2013, 13:39 pm »

Código
  1. Host Accept();
La función devuelve un Host pero la has implementado como que devuelve un Socket.

Por otro lado, la implementación debería ir en un fichero .cpp, las definiciones en un fichero .hpp y estas se incluyen mutuamente. No tienes que hacer cosas como esta:

Código
  1. class Socket;

Que no estoy muy seguro que funcione bien (el compilador no puede saber que miembros tiene Socket desde el otro fichero cpp).


En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
<<<-Basura->>>


Desconectado Desconectado

Mensajes: 388



Ver Perfil
Re: Problema con #includes
« Respuesta #2 en: 4 Junio 2013, 17:52 pm »

Si están implementadas de forma separada en ficheros .cpp y .hpp, pero aquí lo agrego pegado porque son muchos muchos métodos.. entonces solo estoy pegando donde esta el problema.

Siento mucho ese error del return queda

Código
  1. Socket SocketRetorno(HostEstructura);
  2. return SocketRetorno;
  3. }
  4.  

El problema es que si elimino esta linea:
Código
  1. class Socket;
  2.  

Me da mas problemas, esto se debe a que No esta incluido el fichero de Socket.hpp en el Connectividad.cpp, pero si lo incluyo me da problemas y si no lo incluyo también, como puede ver del lado de la clase Socket.cpp si esta incluido el fichero "Conectividad.hpp", el problema es con el método Accept() que tiene que devolver un objeto tipo socket pero... como obtiene la clase socket si no ha sido declarada y no se puede incluir
En línea

<<<--Basura-->>>
amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Problema con #includes
« Respuesta #3 en: 4 Junio 2013, 18:41 pm »

Ah vale.

No deberías darte problemas el include siempre que lo pongas dentro del protector (ahí lo tienes fuera)

Con protector me refiero a:

Código
  1. #ifndef _SOCKET_CPP
  2. #define _SOCKET_CPP
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
<<<-Basura->>>


Desconectado Desconectado

Mensajes: 388



Ver Perfil
Re: Problema con #includes
« Respuesta #4 en: 4 Junio 2013, 20:03 pm »

http://stackoverflow.com/questions/2133250/does-not-name-a-type-error-in-c

Hay en esa pagina tiene un problema similar al mio, lo resuelve pero... no presenta el problema que yo tengo ya que yo trato de retornar la clase he usar el constructor...

Los includes están dentro y bien los he probado de todas formas y nada...
En línea

<<<--Basura-->>>
<<<-Basura->>>


Desconectado Desconectado

Mensajes: 388



Ver Perfil
Re: Problema con #includes
« Respuesta #5 en: 4 Junio 2013, 20:11 pm »

Bueno Ahora solo me esta dando error en el método:

Código
  1. Socket Conectividad::Accept(){
  2. //Variables
  3. int addrlen = sizeof(sockaddr_in); // Tamaño
  4. Host HostEstructura; // Return
  5.  
  6. // Acepta la Conexion
  7. HostEstructura.setSocket( accept(host->getSocket(), (sockaddr*)HostEstructura.getSockAddress(),  (socklen_t*)&addrlen ) );
  8.  
  9. Socket SocketRetorno(&HostEstructura);
  10. return SocketRetorno;
  11. }
  12.  
Este es el error que me da
Citar
Lib/Socket/Conectividad.hpp:25:29 return type 'struct Socket' is incomplete
Lib/Socket/Conectividad.gpp:33:22 variable 'Socket SocketRetorno' has initializer but incomplete type

Compilation fail.
En línea

<<<--Basura-->>>
amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Problema con #includes
« Respuesta #6 en: 4 Junio 2013, 20:33 pm »

La clase socket no tiene constructor copia.

Creo que lo más sencilo es que hagas esto:
Código
  1. Socket* Conectividad::Accept(){ // Puntero
  2. //Variables
  3. int addrlen = sizeof(sockaddr_in); // Tamaño
  4. Host HostEstructura; // Return
  5.  
  6. // Acepta la Conexion
  7. HostEstructura.setSocket( accept(host->getSocket(), (sockaddr*)HostEstructura.getSockAddress(),  (socklen_t*)&addrlen ) );
  8.  
  9. Socket* SocketRetorno = new Socket(&HostEstructura);
  10. return SocketRetorno;
  11. }

Aunque en mi opinión, creo que es más práctico hacer un constructor adicional en la clase Socket con estos datos.
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
<<<-Basura->>>


Desconectado Desconectado

Mensajes: 388



Ver Perfil
Re: Problema con #includes
« Respuesta #7 en: 5 Junio 2013, 00:52 am »

Ya lo he implementado pero me da otro error:
Citar
Lib/Socket/Conectividad.hpp:33:52: error: invalid use of incomplete type 'struct Socket'
Lib/Socket/Conectividad.hpp:6:7: error: forward declaration of 'struct Socket'


Que podría ser eso
En línea

<<<--Basura-->>>
amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Problema con #includes
« Respuesta #8 en: 5 Junio 2013, 00:55 am »

Ya lo he implementado pero me da otro error:
Que podría ser eso
Eliminastes lo de class socket;?

Estoy un poco extrañado, normalmente todo esto es algo mecánico y rutinario.
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
<<<-Basura->>>


Desconectado Desconectado

Mensajes: 388



Ver Perfil
Re: Problema con #includes
« Respuesta #9 en: 5 Junio 2013, 09:22 am »

Mira para Tratar de resolverlo he hecho un código sin sentido pero útil que simula lo que esta pasando, tengo 2 fichero A.hpp y B.hpp

A.hpp:
Código
  1. #include "B.hpp"
  2.  
  3. #ifndef _A_
  4. #define _A_
  5.  
  6. class A{
  7. private:
  8. B* b;
  9. public:
  10. A(int);
  11. A(B*);
  12. };
  13.  
  14. A::A(int algo){
  15. b = new B(algo);
  16. }
  17.  
  18. A::A(B *pB){
  19. b = pB;
  20. }
  21.  
  22. #endif
  23.  

B.hpp:
Código
  1. //#include "A.hpp"
  2. #ifndef _B_
  3. #define _B_
  4.  
  5. //class A;
  6.  
  7. class B{
  8. private:
  9. int dato;
  10. public:
  11. B(int);
  12. //A* retornoA();
  13. };
  14.  
  15. B::B(int algo){
  16. dato = algo;
  17. }
  18.  
  19. /*
  20. A* B::retornoA(){
  21. A *a = new A(10);
  22. return a;
  23. }
  24. */
  25. #endif
  26.  

main:
Código
  1. #include "A.hpp"
  2.  
  3. int main(){
  4. return 0;
  5. }
  6.  

Como puedes ver en "B.hpp", tiene cosas comentadas, esa es la forma que tenía el código antes de que surgiera el problema...

Citar
Lo que tienes que hacer.. es descomentar lo que veas que es necesario.
Estoy usando el IDE geany en linux
El compilador g++
En línea

<<<--Basura-->>>
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
No funcionan los includes???
PHP
Luisango 7 2,246 Último mensaje 13 Diciembre 2006, 21:21 pm
por Luisango
Ayuda con PHP e includes
PHP
Spider-Net 0 1,384 Último mensaje 13 Septiembre 2007, 22:02 pm
por Spider-Net
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines