2012-04-15 4 views
2

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

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

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

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

Как идентификатор типа «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» начинается определение «Я» .. но в то же время, мне нужно я быть определен для В. Так что я не знаю, как определить как перед другим. Я предполагаю, что мне нужно более продвинутое решение, но я не знаю.

//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 дня.

+0

Удалена отладочная метка. Термин «отладка» обычно используется для идентификации процесса идентификации и исправления ошибки в запущенной программе, в то время как это ошибка компиляции. –

+0

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

ответ

5

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

class B; // << Forward declaration of B 

class I 
{ 
private: 
B* my_private_b; 

public: 
I(B& handle); 
} 

в начале File1.h

3

Одна проблема заключается в том, что это не декларация, а определение:

namespace charon 
{ 
  class charon_ 
  { 

  }; 
} 

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

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

namespace charon 
{ class charon_; } 

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

+0

Ох, я попробую это прямо сейчас. –

Смежные вопросы