C ++循环包含问题

时间:2011-01-13 21:02:49

标签: c++ include header-files include-guards cyclic-reference

我有这个文件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中)。

嗯......不知道如何面对这个?我尝试了一切,我到处提出声明,当然,他们没有任何帮助。 怎么解决这个??? (我想最好的做法存在,我希望更好:))。

三江源。

2 个答案:

答案 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 Loggerlogger.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"