11

コンパイルすると、「エラー C2061: 構文エラー: 識別子 'Player'」というエラー コールがあります。

コードの何が問題なのかわかりません。これが私のコードです

#include "Platform.h"
#include "Player.h"
class Collision
{
public:
  Collision(void);
  ~Collision(void);
  static bool IsCollision(Player &player, Platform& platform);
};

「IsCollision」メソッドに誤りがあります。

Player.h

#include <SFML/Graphics.hpp>
#include "rapidxml.hpp"
#include <fstream>
#include <iostream>
#include "Collision.h"
using namespace rapidxml;
class Player
{
private:
    sf::Texture playerTexture;
    sf::Sprite playerSprite;
    sf::Vector2u position;
    sf::Vector2u source;
    sf::Vector2u size;
    int frameCounter, switchFrame, frameSpeed;
    int walkSpriteWidth;
    float velocity;
    bool isWalk;
    bool isStand;
    bool isFaceRight;

public:
    Player(void);
    ~Player(void);

    void Init();
    void Draw(sf::RenderWindow *window);
    void MoveForward();
    void MoveBackward();
    void Update(sf::Clock *clock);
    void SetSourceY(int value);
    void SetWalk(bool value);
    void SetFacing(std::string value);
    void SetStand(bool value);
    void Stand();
    std::string GetStatus();
    void PrintStatus();
    sf::Vector2f GetPosition();
    int GetWidth();
    int GetHeight();
};
4

3 に答える 3

16

循環インクルード依存関係があります。Collision.h には Player.h が含まれ、その逆も同様です。クラスは宣言に必要ないため、最も簡単な解決策は#include "Collision.h"からを削除することです。それに加えて、あなたのインクルードの一部は前方宣言に置き換えることができるようです:Player.hCollisionPlayerCollision.h

// forward declarations
class Player;
class Platform;

class Collision
{
public:
  Collision(void);
  ~Collision(void);
  static bool IsCollision(Player &player, Platform& platform);
};

Collision次に、インクルードをの実装ファイルに入れることができます。

于 2013-04-03T08:37:11.730 に答える
7

これはよくある間違いです。循環インクルード依存関係があります。

#include "Player.h"コードを見て、class Player;in に 置き換える必要がありますCollision.h。これは「前方宣言」と呼ばれ、循環依存を壊します。


また、次のようにインクルード ガードを追加するとよいでしょう。

#ifndef MY_PLAYER_CLASS
#define MY_PLAYER_CLASS

...

#endif

これは、作成するヘッダーごとに行う必要があります。

于 2013-04-03T08:37:58.277 に答える