3

私は演習としてC++で小さなゲームをプログラミングしていますが、難問に遭遇しました。基本的な考え方は、aLevelにはのvectorがありEntity、各Entityインスタンスはそれが属するレベルを知っているということです。これまでのところかなり簡単です。

Entityクラスが何であるかを理解できなかったため、コンパイルエラーが発生していLevelました。の宣言の直前の単純なフォワードクラス宣言Entityは、それを簡単に修正しました。しかし、私はすでにに含め"Level.h"てい"Entity.h"ます。そしてLevel、とEntityは同じ名前空間で宣言および定義されています。

注: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++ コンパイラの仕組みではありません。それが行うことは、基本的に一度に 1 つの翻訳単位ずつファイルを通過することです。TU は、大まかに言えば、すべてのインクルードを含む実装ファイルです。

Level.handにガードが含まれていてEntity.h(おそらくそうなっています)、それらが互いにインクルードしている場合、順序に応じてそのうちの 1 つがコンパイラーによって除外され、名前の 1 つが宣言されません。

経験則として、可能な場合は前方宣言を使用し、include必要な場合は s を使用します。

于 2013-03-22T13:14:33.420 に答える