我在openGl中创建了一个游戏,我遇到了一个问题,这个问题现在让我困扰了近2个小时。 主要功能在readobj.cpp中,其中包括World.h,我有一个使用Ball.h和Stick.h的World.h文件。另一方面,有一个Game.h文件,Ball.h和Stick.h都在使用它。
World.h
#include "Ball.h"
#include "Camera.h"
#include "Stick.h"
class World
{
Ball ball[15];
Ball qBall;
Camera camera;
public:
World();
void update();
void render();
};
Stick.h
#include "Game.h"
class Stick
{
point power;
public:
void setPosition(point);
void setPower(point);
void render();
void update();
};
Ball.h
#include "Game.h"
class Camera
{
public:
Camera();
void update();
void render();
};
Game.h
class point {
public:
double x,y,z;
};
我得到的错误是
g++ -Wall -c readobj.cpp -L. -lBall -lWorld -lCamera -lStick
In file included from Camera.h:1:0, from World.h:2, from readobj.cpp:12:
Game.h:1:7: error: redefinition of ‘class point’
Game.h:1:7: error: previous definition of ‘class point’
In file included from Stick.h:1:0,
from World.h:3,
from readobj.cpp:12:
Game.h:1:7: error: redefinition of ‘class point’
Game.h:1:7: error: previous definition of ‘class point’
答案 0 :(得分:4)
使用包含警卫!
示例性:
World.h:
#ifndef WORLD_H // <<<<<<<<< Note these preprocessor conditions
#define WORLD_H
#include "Ball.h"
#include "Camera.h"
#include "Stick.h"
class World
{
Ball ball[15];
Ball qBall;
Camera camera;
public:
World();
void update();
void render();
};
#endif // WORLD_H
<强>解释强>
如果头文件包含在其他头文件中,并且这些头文件在编译单元中冗余发生,则会出现这些'重新定义' / '重新声明'错误。
如上所示的所谓include guard条件会阻止预处理器多次呈现包含的代码,从而导致此类错误。
答案 1 :(得分:1)
您似乎无法保护您的标头不会被多次包含。
对于每个标题,请执行以下操作: 例如,对于game.h
#ifndef GAME_H
#define GAME_H
/*put your code here*/
#endif
或者另一种方式可能是从每个标题开始,这不在标准中,但大多数编译器都支持它。
#pragma once
告诉编译器只包含一次标题。
基本上,当您包含标头时,预处理器会将标头中的代码放入.cpp文件中。因此,如果这种情况发生不止一次,您最终会得到相同类别的多个声明等。