为了账号安全,请及时绑定邮箱和手机立即绑定

C+#包括警卫

C+#包括警卫

C++
一只萌萌小番薯 2019-07-10 16:40:38
C+#包括警卫我是C+新手,但我在C#和Java方面有一些编程经验,所以我可能缺少一些C+特有的基本知识。问题是我不知道出了什么问题,我会粘贴一些代码来解释这个问题。我有三门课,GameEvents,物理学和GameObject。我有他们每一个的标题。GameEvents有一个物理和一个游戏对象列表。物理学有一个游戏对象列表。我想要实现的是,我希望GameObject能够访问或拥有一个物理对象。如果我简单地将“Physics.h”包含在GameObject中,我就会得到我理解的“错误C 2111:‘ClassXXX’:‘class’type refinition”。这就是我认为#包括-后卫会有帮助的地方,所以我给我的物理防护增加了一个包括后卫。h,因为这是我想要包括两次的标题。这就是它的样子#ifndef PHYSICS_H#define PHYSICS_H#include "GameObject.h"#include <list>class Physics{private:     double gravity;     list<GameObject*> objects;     list<GameObject*>::iterator i;public:     Physics(void);     void ApplyPhysics(GameObject*);     void UpdatePhysics(int);     bool RectangleIntersect(SDL_Rect, SDL_Rect);     Vector2X CheckCollisions(Vector2X, GameObject*);};#endif // PHYSICS_H但是,如果我在我的GameObject.h中包含“Physics.h”,现在如下所示:#include "Texture2D.h"#include "Vector2X.h"#include <SDL.h>#include "Physics.h"class GameObject{private:     SDL_Rect collisionBox;public:     Texture2D texture;     Vector2X position;     double gravityForce;     int weight;     bool isOnGround;     GameObject(void);     GameObject(Texture2D, Vector2X, int);     void UpdateObject(int);     void Draw(SDL_Surface*);     void SetPosition(Vector2X);     SDL_Rect GetCollisionBox();};我有很多问题不明白他们为什么会出现。如果我不包括“Physics.h”,我的代码运行得很好。我非常感谢你的帮助。
查看完整描述

3 回答

?
慕森卡

TA贡献1806条经验 获得超8个赞

这里有循环引用:Physics.h包括GameObject.h包括Physics.h..你们班Physics使用GameObject*(指针)类型,因此不需要包括GameObject.h在……里面Physics.h但只需使用前向声明-而不是

#include "GameObject.h"

class GameObject;

此外,在每个头文件中放置保护。


查看完整回答
反对 回复 2019-07-10
  • 3 回答
  • 0 关注
  • 343 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信