2012-04-15 18 views
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); 
} 

残念ながら、私は「ファイル1」が「私は」..まだ同時に、私はだから私は定義する方法がわからないB.のために定義する必要が定める始まる前に、「B」は、宣言必要私はより高度な解決策が必要だと思っていますが、わかりません。

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

public: 
B(); 
} 

もし私がその答えを見つけることができれば、おそらく私はこの次の部分を自分でチェックすることができます。あなたが正しい方向に進んでいるかどうかを確認することが良いと思うなら、問題のコードをすべて貼り付けます。

。#。#。#。#。#。#。#。#。#。#。#。#。#。#。#。#。#。#。#。#。#。#。# #。#。#。

十分ではありませんでしたか? ここに4つのファイルすべてからのコードのコメントを除くすべての行があります。知覚される重要度の順に。

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

Bへの参照とポインタだけを使用しているので、のようになります。Bの順方向宣言であれば足りるでしょう。追加:

namespace charon 
{ 
  class charon_ 
  { 

  }; 
} 

はあなたが唯一のcharon_がクラス内であることを言っていない:

class B; // << Forward declaration of B 

class I 
{ 
private: 
B* my_private_b; 

public: 
I(B& handle); 
} 

File1.h

3

一つの問題の初めには、これは宣言ではなく、定義ということです名前空間charonは、空であるとも言います。後でクラスメンバーを追加することはできません。

良い方法はただクラスが存在しますが、詳細を抜けて、コンパイラに指示します

namespace charon 
{ class charon_; } 

です。

+0

ああ、私は今それを試してみるでしょう。 –

関連する問題