2011-01-13 13 views
3

私はこのファイルlogger.hppを持っています。 logger.hppにはevent.hppが含まれ、event.hppにはlogger.hppが含まれています。C++巡回包含問題

  • logger.hppにoperatorを定義する必要があるため、event.hppを含める必要があります。

  • イベントevent.hppにクラスイベントで定義される友人関係があるため、logger.hppをインクルードする必要があります。

まあこれは、当然のことながら、巡回再帰です。

私はこの試みた:logger.hppで)

1:

#ifndef _LOGGER_HPP_ 
#define _LOGGER_HPP_ 

#include "event.hpp" 

class Event; // Forward decl 

// Class definitions 
... 

は動作しません。

ISO C++が無いタイプで 「ロガー」の宣言を禁じ

コンパイラ:コンパイラが(と、彼は右のコースです)event.hppでロガーと呼ばれていない認識のタイプがあることを私に伝えます友情宣言がある行(event.hpp内)を示しています。 event.hppで

2):

#ifndef _EVENT_HPP_ 
#define _EVENT_HPP_ 

#include <string> 

#include "logger.hpp" 

class Logger; // Forward decl 

// Class definitions 
... 

は動作しません。コンパイラはlogger.hppにイベントと呼ば認識されていないタイプがある(そして、再び、それは明白な理由のために右である)があることを私に伝えます:

ISO C++が無いタイプ

と「イベント」 の宣言を禁止します

コンパイラは、オペレータ宣言がある行(logger.hpp内)を示します。

まあ...これに対処する方法がわからないのですか?私はすべてを試しましたが、どこにでも宣言をしましたが、もちろん彼らは何の助けもしていません。 これを解決するにはどうすればいいですか? (私はベストプラクティスが存在すると思います、それは私がそう望みます:))。

ありがとうございます。

+3

あなたのヘッダーガード識別子なし

class Event; class Logger { public: /*! * Constructor */ Logger(); /*! * Destructor */ ~Logger(); /*! * My operator */ Logger& operator<<(const Event& e); private: ... }; 

のようにそれを行うには、それらを変更、使用しても大丈夫ではありません。 http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identifier – GManNickG

答えて

11

logger.hpp#include "event.hpp"を取り除く - あなたが必要とするすべての関数プロトタイプでEventオブジェクトへの参照である場合class Eventの前方宣言は十分なはずです:

#ifndef _LOGGER_HPP_ 
#define _LOGGER_HPP_ 

// #include "event.hpp" // <<-- get rid of this line 

class Event; // Forward decl 

// Class definitions 
... 

class Loggerの実施logger.cpp意志でおそらくevent.hppを含める必要があります。

3

宣言を転送するときは、#includeを入れないでください。 #include "event.hpp"