我有这个文件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'没有类型
编译器指示我在友情声明中的行(在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中)。
嗯......不知道如何面对这个?我尝试了一切,我到处提出声明,当然,他们没有任何帮助。 怎么解决这个??? (我想最好的做法存在,我希望更好:))。三江源。
答案 0 :(得分:12)
摆脱#include "event.hpp"
中的logger.hpp
- 如果你需要的只是对函数原型中class Event
对象的引用,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
。
答案 1 :(得分:3)
转发申报时,请勿加入#include
。这样做
class Event;
class Logger {
public:
/*!
* Constructor
*/
Logger();
/*!
* Destructor
*/
~Logger();
/*!
* My operator
*/
Logger& operator<<(const Event& e);
private:
...
};
没有#include "event.hpp"