En primer lugar me gustaría hacerte una recomendación. Incluye el código en tu respuesta en vez de usar enlaces a imágenes. Para que el código aparezca conveniente coloreado es necesario elegir el lenguaje que proceda en el desplegable "Highlight". Esto facilita la lectura de los mensajes y permite copiar el código para, por ejemplo, reutilizarlo o comentarte los problemas que tienes.
Cuando tu pones un include en C/C++ estás, literalmente, añadiendo el contenido de dicho fichero. El compilador al encontrar un include buscará el fichero señalado y sustituirá la instrucción del include por el contenido del fichero.
El diseño del ejemplo de arriba se usa como salvaguarda para evitar que los includes anidados provoquen duplicidades (si un archivo recibe de dos vías diferentes la declaración de una función la compilación fallará).
El código anterior también puede usarse con otros fines, pero en tu caso el fín es el que te comento. Si las dos clases van a estar en el mismo fichero (y este es una cabecera) únicamente necesitas una guarda. Simplemente haz que la guarda abarque toda la cabecera:
Código C:
Ver original#ifndef __GUARDA__
#define __GUARDA__
class Clase1
{
// ...
};
class Clase2
{
// ...
};
#endif
Si resulta que me estoy equivocando y que, efectivamente, tienes cada clase en un fichero independiente entonces sí que necesitas dos guardas distintas (una para cada fichero).
Más cosas.
Código C++:
Ver originalclass Clase1
{
public:
Clase2 c2; // <<--- 1
Clase2* c2; // <<--- 2,3
};
- No puedes usar aquí Clase2 por valor porque el compilador aun no sabe qué es Clase2.
- Tampoco puedes usar un puntero a Clase2 porque el compilador no sabe si Clase2 es una estructura, un puntero a función, un puntero a un tipo nativo...
- No se puede repetir el nombre de las variables si éstas tienen el mismo ámbito.
Lo siguiente sería más correcto en tu caso (que es similar a lo que te propuso Instru):
Código C++:
Ver original// Indicas que en el programa va a haber un objeto con nombre Clase2.
// A partir de este momento el compilador sabe que existe este objeto aunque
// aun no tiene ni idea ni de su tamaño ni de cómo se usa... pero sabe que existe
// Esto implica que no podrás usar Clase2 por valor, sino como puntero y
// también implica que no podrás acceder a sus miembros hasta que no pongas
// su declaración completa.
class Clase2;
class Clase1
{
public:
// Tenemos que usar un puntero debido a lo que he se ha explicado unas lineas antes
Clase2* c2;
};
class Clase2
{
public:
// Aquí si podemos usar Clase1 por valor porque ya hemos declarado Clase1
// y, por ello, el compilador ya tiene toda la información necesaria para usarla.
// Por supuesto también podríamos usar la versión puntero si nos interesa más.
Clase1 c1;
};
Y con la maravillosamente escueta imagen que has publicado poco más te puedo decir, espero que estas indicaciones te sirvan de algo.
Un saludo.