C ++正确使用标头的方法

时间:2014-05-08 16:22:29

标签: c++

我在程序中使用标题并不新鲜,但我最近遇到了一个奇怪的问题。

#ifndef PLAYER_HEADER_GUARDS
#define PLAYER_HEADER_GUARDS

#include "CollidableObject.h"
#include "Includes.h"

extern const int ANIMATION_EXTENDER;
extern class MapSystem *mapSystem;

class Player : public CollidableObject
{
     //declaration of rest of the class
};

#endif

我有很多类分为几个文件(及其各自的标题),但这是我当前的问题:即使我已经包含了CollidableObject.h,编译器(CodeBlocks)也会抛出错误

Player.h|12|error: expected class-name before '{' token|

问题出现在代码的“:public CollidableObject”部分,因为程序在我添加之前工作正常。不应该包括CollidableObject头(我不发布它,但它基本上看起来一模一样,并定义类CollidableObject)删除这种问题?此外,

extern class MapSystem *mapSystem;

据我所知,这个语句应该在extern之后编译没有额外的“class”,但如果我删除了class关键字,它会抛出错误“在* token之前预期的类型限定符”。 MapSystem类也已经在之前定义过,它应该可以正常工作 - 但没有class关键字,它不会。

这让我想到了我的问题 - 我在头文件中犯了什么错误,导致了这样的问题?我之前没有参与的多项目项目存在这样的问题。

1 个答案:

答案 0 :(得分:5)

听起来"CollidableObject.h""Includes.h"尝试重新加入"Player.h",从而导致循环依赖。结果是Player最终在CollidableObject之前被定义,因此后一个名称在此时未被声明。

确保这些标头或其任何依赖项都不包含"Player.h"。如果需要使用该名称,您可能需要添加class Player;的前向声明。

还要检查"CollidableObject.h"是否确实定义了class CollidableObject(可能是拼写错误?),并且有一个唯一命名的包含守卫。

至于第二个问题:

extern class MapSystem *mapSystem;

这可以作为class MapSystem的声明加倍,因此不需要先前的声明。

extern MapSystem *mapSystem;

这不会声明MapSystem(它只表示它是类型名称,而不是类),因此它需要先前的声明。