Problema con #includes

Iniciado por <<<-Basura->>>, 4 Junio 2013, 06:35 AM

0 Miembros y 1 Visitante están viendo este tema.

<<<-Basura->>>

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 (cpp) [Seleccionar]

#include "Conectividad.hpp"

#ifndef _SOCKET_CPP
#define _SOCKET_CPP
class Socket{
private:
Host *host;
public:
Receiver *receiver;
Sender *sender;
Conectividad *conectividad;
public:
Socket(Host*);
};

Socket::Socket(Host*pHost){
this->host = pHost;
this->receiver = new Receiver(this->host);
this->sender = new Sender(this->host);
this->conectividad = new Conectividad(this->host);
}


Esto tiene el otro archivo
Código (cpp) [Seleccionar]


#ifndef _CONECTIVIDAD_CPP
#define _CONECTIVIDAD_CPP

class Socket;

class Conectividad {
private:
Host *host;
public:
Conectividad(Host*,int);

bool Bind();
bool Listen(int);
Host Accept();
bool Connect();

Socket Acceptar();
};

Socket Conectividad::Accept(){
//Variables
int addrlen = sizeof(sockaddr_in); // Tamaño
Host HostEstructura; // Return

// Acepta la Conexion
HostEstructura.setSocket( accept(host->getSocket(), (sockaddr*)HostRetorno.getSockAddress(),  (socklen_t*)&addrlen ) );

Socket SocketRetorno(HostEstructura);
return HostEstructura;
}
#endif

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??
<<<--Basura-->>>

amchacon

Código (cpp) [Seleccionar]
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 (cpp) [Seleccionar]
class Socket;

Que no estoy muy seguro que funcione bien (el compilador no puede saber que miembros tiene Socket desde el otro fichero cpp).
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->>>

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 (cpp) [Seleccionar]

Socket SocketRetorno(HostEstructura);
return SocketRetorno;
}


El problema es que si elimino esta linea:
Código (cpp) [Seleccionar]

class Socket;


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
<<<--Basura-->>>

amchacon

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 (cpp) [Seleccionar]
#ifndef _SOCKET_CPP
#define _SOCKET_CPP

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->>>

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...
<<<--Basura-->>>

<<<-Basura->>>

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

Código (cpp) [Seleccionar]

Socket Conectividad::Accept(){
//Variables
int addrlen = sizeof(sockaddr_in); // Tamaño
Host HostEstructura; // Return

// Acepta la Conexion
HostEstructura.setSocket( accept(host->getSocket(), (sockaddr*)HostEstructura.getSockAddress(),  (socklen_t*)&addrlen ) );

Socket SocketRetorno(&HostEstructura);
return SocketRetorno;
}

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.
<<<--Basura-->>>

amchacon

La clase socket no tiene constructor copia.

Creo que lo más sencilo es que hagas esto:
Código (cpp) [Seleccionar]
Socket* Conectividad::Accept(){ // Puntero
//Variables
int addrlen = sizeof(sockaddr_in); // Tamaño
Host HostEstructura; // Return

// Acepta la Conexion
HostEstructura.setSocket( accept(host->getSocket(), (sockaddr*)HostEstructura.getSockAddress(),  (socklen_t*)&addrlen ) );

Socket* SocketRetorno = new Socket(&HostEstructura);
return SocketRetorno;
}


Aunque en mi opinión, creo que es más práctico hacer un constructor adicional en la clase Socket con estos datos.
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->>>

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
<<<--Basura-->>>

amchacon

Cita de: <<<-Underwar->>> en  5 Junio 2013, 00:52 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.
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->>>

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 (cpp) [Seleccionar]

#include "B.hpp"

#ifndef _A_
#define _A_

class A{
private:
B* b;
public:
A(int);
A(B*);
};

A::A(int algo){
b = new B(algo);
}

A::A(B *pB){
b = pB;
}

#endif


B.hpp:
Código (cpp) [Seleccionar]

//#include "A.hpp"
#ifndef _B_
#define _B_

//class A;

class B{
private:
int dato;
public:
B(int);
//A* retornoA();
};

B::B(int algo){
dato = algo;
}

/*
A* B::retornoA(){
A *a = new A(10);
return a;
}
*/
#endif


main:
Código (cpp) [Seleccionar]

#include "A.hpp"

int main(){
return 0;
}


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++
<<<--Basura-->>>