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

C++ Correct way to use headers

本文关键字:方法 C++      更新时间:2023-10-16

我对在程序中使用头并不陌生,但我最近遇到了一个奇怪的问题。

#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关键字,它就不能正常工作。

这就引出了我的问题——我在头文件中犯了什么错误,导致了这样的问题?我以前工作过的多领域项目都没有这样的问题。

听起来像是"CollidableObject.h""Includes.h"试图重新包含"Player.h",导致循环依赖。结果是Player最终被定义在CollidableObject之前,因此在这一点上没有声明后者的名称。

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

还要检查"CollidableObject.h"是否真的定义了class CollidableObject(也许是拼写错误?(,并且有一个唯一命名的include保护。

至于第二个问题:

extern class MapSystem *mapSystem;

这兼作class MapSystem的声明,因此不需要以前的声明。

extern MapSystem *mapSystem;

这并没有声明MapSystem(它只表示它是一个类型名,而不是一个类(,因此它确实需要以前的声明。