[英]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.