C ++ проблема циклического включения [дубликаты]

На этот вопрос уже есть ответ:

Устранить ошибки сборки из-за циклической зависимости между классами 9 ответов

У меня есть этот файл 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.

Мне нужно включить event.hpp, потому что в logger.hpp мне нужно определить оператор.

Мне нужно включить logger.hpp, потому что в event.hpp дружба должна быть определена в классе Event.

Ну, это, конечно, циклическая рекурсия.

Я попробовал это:

1) В logger.hpp:

#ifndef _LOGGER_HPP_
#define _LOGGER_HPP_

#include "event.hpp"

class Event; // Forward decl

// Class definitions
...

Не работает. Компилятор говорит мне, что в event.hpp есть нераспознанный тип, называемый Logger (и он, конечно, прав):

ISO C ++ запрещает объявление 'Logger' без типа

Compiler указывает мне строку (в 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 ++ запрещает объявление 'Event' без типа

Compiler указывает мне строку (в logger.hpp), где есть объявление оператора.

Ну ... не знаешь, как с этим справиться? Я все перепробовал, везде выдвигаю декларации, но, конечно, они не помогают. Как решить это ??? (Я полагаю, что существует лучшая практика, лучше, я надеюсь, что так :)).

Спасибо

Ответы на вопрос(2)

Ваш ответ на вопрос