C++循环包含问题

标签 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++ forbids declaration of ‘Logger’ with no type

编译器告诉我友元声明所在的行(在 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++ forbids declaration of ‘Event’ with no type

编译器指示我(在 logger.hpp 中)有运算符声明的行。

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

谢谢。

最佳答案

去掉 logger.hpp 中的 #include "event.hpp" - class Event 的前向声明应该足够了,如果您所需要的只是对函数原型(prototype)中的 Event 对象的引用:

#ifndef _LOGGER_HPP_
#define _LOGGER_HPP_

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

class Event; // Forward decl

// Class definitions
...

logger.cppclass Logger 的实现可能需要包含 event.hpp

关于C++循环包含问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4685220/

相关文章:

c++ - 如何使用 openvdb(并行)foreach 访问多个网格?

c++ - 找不到 operator= 的匹配项(在 vector<string> 中查找值)

PHP 导入函数

directory - xampp 包括不工作

c++ - 隐藏第三方C++头文件的内容

c++ - 不绘制 QWT 绘图轴

c++ - 由于速度原因使用std vector作为map,靠谱吗?

C++ 在多个文件中包含一个文件

c - 文件之间的结构

c - 为什么 mkdir() 和 rmdir() POSIX 系统调用在不同的头文件中?