Wzajemnie zależne deklaracje klasowe

Próbuję dowiedzieć się, co oznacza ten błąd kompilacji i mam nadzieję, że dobrze to wyjaśnię.

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

Następnie przenosi mnie do powyższego pliku ^ i podkreśla w kolorze żółtym:

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

Również identyfikator typu „charon_”, który jest klasą zdefiniowaną w pliku nagłówkowym charon.h, jest również podkreślony na żółto, prawdopodobnie innym błędem.

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

Mam jednak nadzieję, że wszystkie są związane z pierwszym błędem, myślę, że jest to związane z czymś, co próbuję zrobić.

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

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

Niestety potrzebuję 'B' zadeklarowanego zanim 'plik 1' zacznie definiować 'I' .. ale jednocześnie muszę zdefiniować go dla B. Więc nie wiem jak zdefiniować oba przed drugim .. I zgaduję, że potrzebuję bardziej zaawansowanego rozwiązania, ale nie wiem.

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

public:
B();
}
</code>

Więc jeśli znajdę odpowiedź na to pytanie, może mógłbym po prostu sprawdzić tę następną część. Jeśli uważasz, że dobrze byłoby sprawdzić, czy idę we właściwym kierunku, wkleję cały poniższy kod.

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

Nie dość długo, nie czytałeś? Oto wszystkie linie kodu, z wyjątkiem komentarzy, ze wszystkich czterech plików. W kolejności postrzeganego znaczenia.

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

Są to pliki konstruktorów / 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>

A do finału osobiście nienawidzę czytać, więc odkładałem tylko to pytanie od kogokolwiek. Więc jeśli doszedłeś tak daleko, prawdopodobnie też tego chcesz.

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

Byłbym po prostu zadowolony z odpowiedzi na moją prostszą wersję. Skończyły mi się pomysły, aby naprawić błędy kompilacji i przeszukałem moje ogromne odwołanie do C ++, sprawdzając wszystko, o czym myślę. Cała składnia wygląda na poprawną, myślę, że po prostu jeszcze nie nauczyłem się, jak manipulować kompilatorem, aby robić takie rzeczy.

Nie wiem, pewnie już się włóczę. To mnie frustruje przynajmniej przez ostatnie 3 dni.

questionAnswers(2)

yourAnswerToTheQuestion