[英]error C2143 : missing ';' before '*'
您好,我在互联网上到处搜索答案,但我找不到任何答案。
代码:
#ifndef GAME_H
#define GAME_H
#include "drawEngine.h"
#include "sprite.h"
#include <iostream>
using namespace std;
class Game
{
public:
bool run(void);
protected:
bool getinput(char *c);
void timerUpdate(void);
private:
Sprite* player; // this gives me C2143
double frameCount;
double startTime;
double lastTime;
int posx;
//int posy;
DrawEngine drawArea;
};
#endif
我该如何解决?
精灵.h
#ifndef GAME_H
#define GAME_H
#include "drawEngine.h"
#include "game.h"
enum
{
SPRITE_CLASSID,
};
struct vector
{
float x;
float y;
};
class Sprite
{
public:
Sprite(DrawEngine *de, int s_index, float x = 1, float y = 1, int i_lives = 1);
~Sprite();
vector getPosition(void);
float getX(void);
float getY(void);
virtual void addLives(int num = 1);
int getLives(void);
bool isAlive(void);
virtual bool move(float x, float y);
protected:
DrawEngine *drawArea;
vector pos;
int spriteIndex;
int numLives;
int classID;
vector facingDirection;
void draw(float x, float y);
void erase(float x, float y);
private:
};
#endif
这种情况下的问题似乎是Sprite
未被识别为一种类型。 仔细观察后,您遇到的问题是您定义:
#ifndef GAME_H
#define GAME_H
//...
#endif
在这两个文件中。 您在 .cpp 文件(或 Game.h 文件..第一个代码片段)中执行此操作,您也在 Sprite.h 文件中执行此操作。 问题是在编译器转到 Sprite.h 时,GAME_H 已经定义,因此,由于#ifndef
例程,它不再编译 Sprite.h 文件。
要修复它,请在Sprite.h文件中更改如下:
#ifndef SPRITE_H
#define SPRITE_H
//...
#endif
我猜这是来自 Sprite.cpp 的编译。
Sprite.cpp 包含 sprite.h,其中包含顶部的 game.h。 后者 include 再次包含 sprite.h,由于它的包含保护或 pragma 一次,它什么也不做。 这意味着,那时没有已知的 class 称为 sprite - 在此编译中,它在它的下方。
生成的代码(预处理后,编译前)如下所示:
class Game { Sprite *... };
class Sprite { ... };
Sprite::func() {};
从本质上讲,你不能轻易解决这个问题。 您需要使其中一个标题不依赖于首先包含的另一个标题。 您可以这样做,每次您不需要class 的内容时,转发声明它而不是包含它。
class Game;
class Sprite {...};
和
class Sprite;
class Game { Sprite *...};
所以如果你这样做然后编译 sprite.cpp,预处理的 output 看起来像
class Sprite;
class Game { Sprite *... };
class Sprite { ... };
Sprite::func() {};
这将起作用。 在您声明指向 Sprite 的指针时,编译器不需要知道它到底是什么。 事实上,您唯一需要完整声明的情况是:
就是这样。 可能还有更多,但它们不会是常见的情况,你不应该那么快遇到它们。 在任何情况下,首先使用前向声明,如果这确实不起作用,则包括 header。
class Game
{
friend class Sprite;
public:
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.