簡體   English   中英

錯誤 C2143:缺少“;” 前 '*'

[英]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 的指針時,編譯器不需要知道它到底是什么。 事實上,您唯一需要完整聲明的情況是:

  • 您使用 class 的成員
  • 您從 class 繼承
  • 您在 class 上使用 sizeof
  • 你用它實例化一個模板

就是這樣。 可能還有更多,但它們不會是常見的情況,你不應該那么快遇到它們。 在任何情況下,首先使用前向聲明,如果這確實不起作用,則包括 header。

您需要將其聲明為該名稱空間中的朋友

class Game
{
    friend class Sprite;

public:
   ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM