ошибка C2143: отсутствует ';' до '*' - PullRequest
7 голосов
/ 12 июля 2011

Здравствуйте. Я искал ответ в Интернете везде, но не могу найти.

код:

#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

Как мне это исправить?

sprite.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

Ответы [ 3 ]

9 голосов
/ 12 июля 2011

Проблема в этом случае заключается в том, что 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
2 голосов
/ 12 июля 2011

Я предполагаю, что это из компиляции Sprite.cpp.

Sprite.cpp включает sprite.h, в который входит game.h вверху. Последний включает снова sprite.h, который ничего не делает из-за своей защиты включения или прагмы. Это означает, что на данный момент нет известного класса, называемого sprite - как в этой компиляции, он находится ниже.

Результирующий код (после предварительной обработки, перед компиляцией) будет выглядеть так:

class Game { Sprite *... };

class Sprite { ... };

Sprite::func() {};

По сути, это не легко исправить. Вам нужно сделать так, чтобы один из заголовков не зависел от другого, включаемого первым. Вы можете сделать это, каждый раз, когда вам не нужно содержимое класса, чтобы объявить его вперед вместо того, чтобы включать его.

class Game;
class Sprite {...};

и

class Sprite;
class Game { Sprite *...};

так что если вы сделаете это, а затем скомпилируете sprite.cpp, предварительно обработанный вывод будет выглядеть как

class Sprite;
class Game { Sprite *... };
class Sprite { ... };
Sprite::func() {};

который будет работать. Компилятору не нужно точно знать, что такое Sprite, когда вы объявляете указатель на него. Фактически, единственное время, когда вам нужна полная декларация, это когда:

  • Вы используете членов класса
  • Вы наследуете от класса
  • Вы используете sizeof в классе
  • Вы создаете экземпляр шаблона с ним

И это все. Их может быть больше, но они не будут частыми случаями, и вы не должны сталкиваться с ними так быстро. В любом случае, сначала используйте предварительное объявление, а если оно действительно не работает, то включите заголовок.

0 голосов
/ 12 июля 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...