3

私はこのファイルlogger.hppを持っています:

#ifndef _LOGGER_HPP_
#define _LOGGER_HPP_

#include "event.hpp"

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

#endif

そしてこのファイルevent.hpp

#ifndef _EVENT_HPP_
#define _EVENT_HPP_

#include <string>

#include "logger.hpp"

// Class definitions
class Event {
public:
  /*!
   * Constructor
   */
  Event();
  /*!
   * Destructor
   */
  ~Event();

  /* Friendship */
  friend Logger& Logger::operator<<(const Event& e);
};

#endif

上手。logger.hppにはevent.hppを含め、event.hppにはlogger.hppを含めます。

  • logger.hppで演算子を定義する必要があるため、event.hppを含める必要があります。

  • event.hppには、クラスEventで定義される友情があるため、logger.hppを含める必要があります。

もちろん、これは周期的な再帰です。

私はこれを試しました:

1)logger.hpp:

#ifndef _LOGGER_HPP_
#define _LOGGER_HPP_

#include "event.hpp"

class Event; // Forward decl

// Class definitions
...

動作しません。コンパイラは、event.hppにLoggerと呼ばれる認識されないタイプがあることを教えてくれます(そしてもちろん彼は正しいです):

ISO C ++は、タイプのない「ロガー」の宣言を禁止します

コンパイラは、友情宣言がある行(event.hpp内)を示します。

2)event.hppの場合:

#ifndef _EVENT_HPP_
#define _EVENT_HPP_

#include <string>

#include "logger.hpp"

class Logger; // Forward decl

// Class definitions
...

動作しません。コンパイラーは、logger.hppにEventと呼ばれる認識されないタイプがあることを教えてくれます(そして、これも明らかな理由で正しいです):

ISO C ++は、タイプのない「イベント」の宣言を禁止します

コンパイラは、演算子宣言がある行(logger.hpp内)を示します。

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

ありがとうございました。

4

2 に答える 2

13

#include "event.hpp"inを削除します-関数プロトタイプ内のオブジェクトへの参照だけが必要な場合はlogger.hpp、の前方宣言で十分です。class EventEvent

#ifndef _LOGGER_HPP_
#define _LOGGER_HPP_

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

class Event; // Forward decl

// Class definitions
...

class Loggerinの実装には、logger.cppおそらくを含める必要がありますevent.hpp

于 2011-01-13T21:06:51.467 に答える
3

前方宣言するときは、を入れないでください#include。好きですか

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

なしで#include "event.hpp"

于 2011-01-13T21:07:32.083 に答える