繁体   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