C++ 类在单独文件中的奇怪行为

C++ 类在单独文件中的奇怪行为,c++,class,object,C++,Class,Object,我有一些类似这样的课程: 世界卫生组织: #ifndef WORLD_H_ #define WORLD_H_ #include "GameObject.h" #include <vector> class World { public: std::vector<GameObject*> objects; World(); virtual ~World(); void add(GameObject*); void initialize(); void update();

我有一些类似这样的课程:

世界卫生组织:

#ifndef WORLD_H_
#define WORLD_H_
#include "GameObject.h"
#include <vector>

class World
{
public:
std::vector<GameObject*> objects;

World();
virtual ~World();
void add(GameObject*);
void initialize();
void update();
void render();
};

#endif /* WORLD_H_ */
为什么会出现错误:
World.h,第9行-“游戏对象”尚未声明 和
“World.h,第13行-'游戏对象'未在此范围内声明”


我正在使用Linux GCC 4.8.1编译器。

您有一个循环包含依赖项。但在这种情况下,您可以使用前向声明,而不是include:

#ifndef WORLD_H_
#define WORLD_H_
#include <vector>

class GameObject; // forward declaration

class World
{
  // as before
};
#endif
然后,在需要它们的实现文件中包含头


有关更多详细信息,请参阅。

您有一个循环包含依赖项。但在这种情况下,您可以使用前向声明,而不是include:

#ifndef WORLD_H_
#define WORLD_H_
#include <vector>

class GameObject; // forward declaration

class World
{
  // as before
};
#endif
然后,在需要它们的实现文件中包含头


有关详细信息,请参阅。

您有一个循环包含依赖项。这是行不通的。谷歌搜索“正向引用c++”,你会找到解决这个问题的方法。你有一个循环包含依赖项。这是行不通的。用谷歌搜索“forward references c++”,你会找到解决这个问题的方法。实际上,我想知道在类中包含每个文件是否有意义。这样,如果在实现中只需要其中一个,则不必同时包含这两个。这不是
#ifdef
的一部分吗?注:这是一个问题,我不肯定任何事情。@charly我不知道在类中包含文件意味着什么。而include-guards的目的是避免重复包含同一个东西。对不起,我的意思是将h文件包含在其他文件中。i、 e:在gameobject.h中添加“#include”world.h”,并在world.h中添加“
”。守卫将确保它只定义一次,如果你只需要GameObject,你只需要包含GameObject.h,而不是GameObject.h和world.h。这会导致问题吗?当我这样做时,它会出现一个错误,称为“类点的前向声明”@JaredLoomis如果是这样,那么您必须使用与所显示的不同的代码。看看我答案末尾的链接,它解释了何时可以使用前向声明。你只需要删除其中一个包含就可以打破循环依赖关系,但是从你的代码中看起来你可以同时删除这两个。实际上,我想知道在类中包含每个文件是否有意义。这样,如果在实现中只需要其中一个,则不必同时包含这两个。这不是
#ifdef
的一部分吗?注:这是一个问题,我不肯定任何事情。@charly我不知道在类中包含文件意味着什么。而include-guards的目的是避免重复包含同一个东西。对不起,我的意思是将h文件包含在其他文件中。i、 e:在gameobject.h中添加“#include”world.h”,并在world.h中添加“
”。守卫将确保它只定义一次,如果你只需要GameObject,你只需要包含GameObject.h,而不是GameObject.h和world.h。这会导致问题吗?当我这样做时,它会出现一个错误,称为“类点的前向声明”@JaredLoomis如果是这样,那么您必须使用与所显示的不同的代码。看看我答案末尾的链接,它解释了何时可以使用前向声明。您只需要删除其中一个include就可以打破循环依赖关系,但从代码中可以同时删除这两个include。
#ifndef GAMEOBJECT_H_
#define GAMEOBJECT_H_

class World;
class Point;

class GameObject
{
  // as before
};
#endif