Declaraciones de clase mutuamente dependientes

Estoy tratando de averiguar qué significa este error de compilación, y espero explicar esto bien.

<code>In file included from sys/charon.cpp:4:0:
</code>

Siguiendo esto me lleva a ese archivo ^ anterior, y subraya en amarillo esto:

<code>#include "../headers/charon.h"
</code>

Además, el identificador de tipo "charon_", que es una clase definida dentro del archivo de encabezado charon.h, también está subrayado en amarillo, posiblemente un error diferente.

<code>sys/../headers/charon.h:17:9: error: redefinition of ‘class charon::charon_’
sys/../headers/chio.h:86:9: error: previous definition of ‘class charon::charon_’
sys/charon.cpp:12:20: error: definition of implicitly-declared ‘charon::charon_::charon_()’
</code>

Sin embargo, espero que todos estén relacionados con el primer error, creo que está relacionado con algo que estoy tratando de hacer.

<code>//File 1.h
/**********/
class I
{
private:
B* my_private_b;

public:
I(B& handle);
}
</code>

Desafortunadamente, necesito que se declare 'B' antes de que 'el archivo 1' comience a definir 'I' ... pero al mismo tiempo, necesito que me definan para B. Así que no sé cómo definir ambas cosas antes que las otras ... I Supongo que necesito una solución más avanzada, pero no sé.

<code>//File 2.h
/***********/
class B
{
private:
I i;
O o;

public:
B();
}
</code>

Entonces, si puedo encontrar una respuesta a eso, entonces tal vez podría verificar la siguiente parte por mí mismo. Si crees que sería bueno verificar si voy en la dirección correcta, pegaré todo el código en cuestión a continuación.

. #. #. #. #. #. #. #. #. #. #. #. #. #. #. #. #. #. #. #. #. #. #. #. . #.

No es suficiente, ¿no has leído? Bueno, aquí están todas las líneas, excepto los comentarios, del código de los cuatro archivos. En orden de importancia percibida.

<code>//////////////////////////////////////
/////
/////////////
/////
/////
/////
//File: chio.h

#ifndef CHIO_H
#define CHIO_H
#include <deque>
#include <queue>
#include <iostream>

using namespace std;

namespace charon
{
  class charon_
  {

  };
}
namespace chio
{ 
  class chout_
  {
  private:

  public:
    chout_();
    ~chout_();
  };

  class chin_
  {
  private:
    charon::charon_* engine;

  public:
    chin_(charon::charon_& handle);
    chin_();
    ~chin_();
  };
}

#endif  /* CHIO_H */

//////////////////////////////////////
/////
/////////////
/////
/////
/////
//File: charon.h/* 
//
 * File:   charon.h
 * Author: josh
 *
 * Created on 11 April 2012, 22:26
 */

#ifndef CHARON_H
#define CHARON_H
//#include "boost/thread.hpp"
#include "chio.h"

using namespace std;
using namespace chio;
namespace charon
{
  class charon_ {
  private:
    chout_ engine_output;
    chin_ engine_input;
    //boost::thread input_thread;
    //boost::thread output_thread;
    void start_threads();
    void stop_threads();

  public:
    charon_();
    charon_(charon_ &orig);
    ~charon_();
    void run();
  };
}


#endif  /* CHARON_H */
</code>

Estos son los constructores / archivos cpp.

<code>charon.cpp
#include <iostream>
//#include <boost/thread.hpp>
//#include <boost/date_time.hpp>
#include "../headers/charon.h"

using namespace std;
using namespace charon;
using namespace chio;

namespace charon
{
  charon_::charon_(){
    engine_input = chio::chin_((charon_*)this);
  }
};

//^^charon.cpp^^
---------
//chin.cpp

#include <iostream>
#include <borland/conio.h>
#include <ncurses.h>
#include <deque>
#include "../headers/charon.h"

using namespace std;
using namespace charon;
using namespace chio;
namespace chio
{
  chin_::chin_(charon::charon_& handle) {
    engine = handle;
  }
  chin_::~chin_() {
  }
}
</code>

Y para el final, personalmente odio la lectura, así que he estado postergando solo preguntándole todo esto a cualquiera. Así que si has llegado hasta aquí, probablemente también quieras esto.

<code>"/usr/bin/gmake" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf
gmake[1]: Entering directory `/home/josh/Projects/Maze/Charon'
"/usr/bin/gmake"  -f nbproject/Makefile-Debug.mk dist/Debug/GNU-Linux-x86/charon
gmake[2]: Entering directory `/home/josh/Projects/Maze/Charon'
mkdir -p build/Debug/GNU-Linux-x86/sys
rm -f build/Debug/GNU-Linux-x86/sys/charon.o.d
g++    -c -g -MMD -MP -MF build/Debug/GNU-Linux-x86/sys/charon.o.d -o build/Debug/GNU-Linux-x86/sys/charon.o sys/charon.cpp
In file included from sys/charon.cpp:4:0:
sys/../headers/charon.h:17:9: error: redefinition of ‘class charon::charon_’
sys/../headers/chio.h:86:9: error: previous definition of ‘class charon::charon_’
sys/charon.cpp:12:20: error: definition of implicitly-declared ‘charon::charon_::charon_()’
gmake[2]: *** [build/Debug/GNU-Linux-x86/sys/charon.o] Error 1
gmake[2]: Leaving directory `/home/josh/Projects/Maze/Charon'
gmake[1]: *** [.build-conf] Error 2
gmake[1]: Leaving directory `/home/josh/Projects/Maze/Charon'
gmake: *** [.build-impl] Error 2
</code>

Simplemente me alegraría tener una respuesta a mi versión más simple. Me he quedado sin ideas para corregir los errores de compilación y he hojeado mi enorme referencia de C ++ verificando todo lo que puedo imaginar. Toda la sintaxis parece ser correcta, creo que es solo que todavía tengo que aprender específicamente cómo manipular el compilador para hacer cosas como esta.

No lo sé, probablemente solo estoy divagando ahora. Esto me ha frustrado al menos durante los últimos 3 días.

Respuestas a la pregunta(2)

Su respuesta a la pregunta