3

我正在用 C++ 编写一个小游戏作为练习,我遇到了一个难题。基本思想是 aLevel有一个vectorof Entity,每个Entity实例都知道它属于哪个级别。到目前为止非常简单。

我在我的 Entity 类中遇到了一些令人讨厌的编译错误,因为它无法弄清楚是什么Level。在声明之前的一个简单的前向类声明Entity很容易解决这个问题。但是,我已经包含"Level.h""Entity.h". And LevelandEntity都在同一个命名空间中声明和定义。

注:Entity.h还包括Level.h.

#include "Level.h"

namespace GameNS {

  // Required, otherwise the compiler complains
  class Level;

  class Entity
  {
  public:
  ...

Level编译器不应该在它到达时已经知道是什么Entity吗?

4

1 回答 1

5

不,这不是 C++ 编译器的工作方式。它的作用是基本上一次通过一个翻译单元的文件。TU 松散地说,是一个包含所有内容的实现文件。

如果你在Level.hand中包含了守卫Entity.h(你可能会这样做)并且它们相互包含,根据顺序,其中一个将被编译器遗漏,并且其中一个名称将不会被声明。

根据经验,尽可能使用前向声明,并且include在必须的地方使用。

于 2013-03-22T13:14:33.420 回答