gpt4 book ai didi

C++ 正确使用头文件的方法

转载 作者:搜寻专家 更新时间:2023-10-31 00:35:38 26 4
gpt4 key购买 nike

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

#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 header (我没有发布它,但它看起来基本上一样,并且定义了 CollidableObject 类)可以消除此类问题吗?进一步,

extern class MapSystem *mapSystem;

据我所知,如果没有 extern 后的额外“class”,这条语句应该可以正常编译,但是如果我删除 class 关键字,它会抛出错误“expected type qualifier before * token”。类 MapSystem 之前也已定义,它应该可以正常工作 - 但如果没有 class 关键字,它就不会。

所以这让我想到了我的问题 - 我在头文件中犯了什么错误,导致了这些问题?我以前从事的多文件项目没有遇到过这样的问题。

最佳答案

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

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

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

关于第二个问题:

extern class MapSystem *mapSystem;

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

extern MapSystem *mapSystem;

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

关于C++ 正确使用头文件的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23547299/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com