解决了
真正帮助我的是,我可以在.cpp文件中#include标头而不会导致重新定义的错误.
我是C++的新手,但我在C#和Java方面有一些编程经验,所以我可能会遗漏一些C++独有的基础知识.
问题是我真的不知道什么是错的,我会粘贴一些代码来试图解释这个问题.
我有三个类,GameEvents,Physics和GameObject.我有每个标题.GameEvents有一个Physics和一个GameObjects列表.Physics有一个GameObjects列表.
我想要实现的是我希望GameObject能够访问或拥有一个Physics对象.
如果我只是在GameObject中#include"Physics.h",我会得到"错误C2111:'ClassXXX':'class'类型redtifinition",我理解.这就是我认为#include-guard有帮助的地方所以我在我的Physics.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
Run Code Online (Sandbox Code Playgroud)
但如果我在GameObject.h中#include"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(); …Run Code Online (Sandbox Code Playgroud) 通常#define将用于定义常量或宏.但是,以下列方式使用#define是有效的代码.
#define MAX // does this do anything?
#define MAX 10 // I know how to treat this.
Run Code Online (Sandbox Code Playgroud)
因此,如果我#define MAX 10,我知道我的预处理器用10替换MAX的所有实例.如果某人自己使用#define MAX但没有后续替换值,则它是有效的.这实际上做了什么吗?
我的理由是我在c ++中为c编写编译器并且需要处理预处理器指令但是我无法确定在发生这种情况时是否需要有任何功能,或者我只是忽略了这一次我的预处理完成了.
我的第一直觉是,这将在我的符号表中创建一个没有名为MAX的值的符号,但同样可能它什么都不做.
作为一个问题的补充,这是一种我知道的糟糕形式,但我真的很好奇.实际代码中是否存在使用此类内容的情况?
谢谢,宾克斯
我的项目有这个文件夹结构:
Project/
--Classes/
----Class1.h
----Class1.cpp
--main.cpp
Run Code Online (Sandbox Code Playgroud)
"Class1.h"包含方法定义,"Class1.cpp"是"Class1.h"的源代码.
"Class1.h"的源代码如下:
class Class1 {
public:
void do_something();
};
Run Code Online (Sandbox Code Playgroud)
"Class1.cpp"的源代码如下:
#include "Class1.h"
void Class1::do_something() {
//
}
Run Code Online (Sandbox Code Playgroud)
"main.cpp"的源代码如下:
#include "Classes/Class1.h"
int main(int argc,char** args) {
Class1* var = new Class1();
var->do_something();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,在编译"main.cpp"时,编译器不知道Class1中方法的实现位置,因此它显示了有关未定义引用的链接错误.
我是否必须在命令行中添加任何路径,以便编译器知道它要编译的源文件是什么?如何告诉编译器它还必须编译"Class1.cpp"?