Вопрос по c++ – Взаимозависимые объявления классов

2

Я пытаюсь понять, что означает эта ошибка компиляции, и я надеюсь, что я объясню это хорошо.

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

После этого я перехожу к вышеуказанному файлу ^ и подчеркиваю желтым цветом это:

#include "../headers/charon.h"

Кроме того, идентификатор типа «charon_», который является классом, определенным в заголовочном файле charon.h, также подчеркнут желтым цветом, возможно, с другой ошибкой.

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_()’

Однако я надеюсь, что все они связаны с первой ошибкой, я думаю, что это связано с чем-то, что я пытаюсь сделать.

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

public:
I(B& handle);
}

К сожалению, мне нужно «B» объявлено перед «файлом 1»; начинает определять «я» ... но в то же время мне нужно, чтобы меня определили для B. Так что я не знаю, как определить оба слова раньше других ... Я предполагаю, что мне нужно более сложное решение, но я не знаю не знаю.

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

public:
B();
}

Так что, если я смогу найти ответ на этот вопрос, то, возможно, я мог бы просто проверить эту следующую часть для себя. Если вы считаете, что было бы хорошо проверить, правильно ли я двигаюсь, я вставлю весь код ниже.

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

Не достаточно долго, не читал? Ну, вот все строки, за исключением комментариев, кода из всех четырех файлов. В порядке предполагаемой важности.

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

Это конструкторы / файлы cpp.

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_() {
  }
}

Что касается финала, я лично ненавижу читать, поэтому я откладывал, просто спрашивая все это у кого-нибудь. Так что, если вы зашли так далеко, вы, вероятно, тоже этого захотите.

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

Я был бы просто рад получить ответ на мою более простую версию. У меня закончились идеи по исправлению ошибок компиляции, и я пролистал мою огромную ссылку на C ++, проверяя все, что я могу придумать. Весь синтаксис выглядит правильным, я думаю, что просто мне еще предстоит конкретно научиться манипулировать компилятором, чтобы делать такие вещи.

Я не знаю, я, наверное, сейчас просто болтаю. Это расстраивало меня по крайней мере в течение последних 3 дней.

Первая «ошибка» не является ошибкой, но содержит информацию об ошибке: она сообщает, откуда был включен заголовочный файл, в котором произошла ошибка (что может быть важно, поскольку обнаруженная ошибка может быть результатом чего-то до этого#include). celtschk
Удален тег отладки. Термин отладка обычно используется для идентификации процесса выявления и исправления ошибки в работающей программе, в то время как это ошибка компиляции. David Rodríguez - dribeas

Ваш Ответ

2   ответа
5

File1.h предварительная декларацияB было бы достаточно вместо того, чтобы включить его, поскольку вы используете только ссылки и указатели наB, Добавлять:

class B; // << Forward declaration of B

class I
{
private:
B* my_private_b;

public:
I(B& handle);
}

в началеFile1.h

4

namespace charon
{
  class charon_
  {

  };
}

Вы не только говорите, чтоcharon_ это класс в пространстве именcharonВы также говорите, что он пуст. Затем вам не разрешено добавлять участников класса позже.

Лучший способ это

namespace charon
{ class charon_; }

который просто сообщает компилятору, что класс существует, но опускает детали.

Error: User Rate Limit Exceeded Josh C

Похожие вопросы