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), где есть объявление оператора.
Ну ... не знаешь, как с этим справиться? Я все перепробовал, везде выдвигаю декларации, но, конечно, они не помогают. Как решить это ??? (Я полагаю, что существует лучшая практика, лучше, я надеюсь, что так :)).
Спасибо