基类未定义和致命错误C1903

时间:2017-12-24 14:56:49

标签: c++ inheritance polymorphism virtual fatal-error

我正在用C ++和SFML编写Monopoly游戏。我的应用程序已经有大约20个类,它们很好地协同工作,但我找不到解决一个问题的方法。首先,我需要向您展示一些我的代码,如果我发布太多代码,我很抱歉(我会尝试粘贴简单的最小代码),但是一旦我添加了一行代码,问题就会发生在我的应用程序中 - {{1}进入Field.h,我真的不知道是什么。让我们从应用程序的核心开始,GameState类里面有GameLoop

#include "GameEngine.h"

然后处理所有逻辑的类class GameState : public State { sf::Clock m_clock; sf::Sprite m_background; GameEngine m_gameEngine; public: GameState(); void initialise(); void handleUserInput(); void update(sf::Time); void draw(); }; GameState::GameState(std::shared_ptr<ApplicationData> data) : m_gameEngine(2, "John", "Richard") { //2 players named John and Richard, just for tests now }

GameEngine

目前,它只创造了两名球员

    class GameEngine {
        //players
        std::vector<Player> m_players;
        int m_numberOfPlayers;
        int m_activePlayer = 0;

        //game objects
        GameBoard m_gameBoard;
 public:
        GameEngine(int, std::string, std::string);  
        GameBoard& getBoard() { return m_gameBoard; }   
        Player& getActivePlayer() { return m_players[m_activePlayer]; }
    }; 

Player类没什么特别的,很少有变量和getter和setter函数

GameEngine::GameEngine(int numberOfPlayers, std::string playerOneName, std::string playerTwoName) 
    : m_numberOfPlayers(numberOfPlayers), m_firstDice(FIRST_DICE_POSITION_X, FIRST_DICE_POSITION_Y), 
      m_secondDice(SECOND_DICE_POSITION_X, SECOND_DICE_POSITION_Y) {    
    m_players.push_back(Player(playerOneName, sf::Color::Red, -5, 0));
    m_players.push_back(Player(playerTwoName, sf::Color::Blue, -5, 0)); 
}

另一个重要部分是class Player { int m_positionID = 0; std::string m_name; sf::CircleShape m_token; };

GameBoard

并在所有问题开始的时候class GameBoard { std::array<std::shared_ptr<Field>, BOARD_SIZE> m_board; public: GameBoard(); ~GameBoard() = default; std::shared_ptr<Field>& getField(size_t index) { return m_board[index]; } };

Field

Field是游戏中我所有领域的基类,如Property,Start,GoToJail等。我想要这样的东西:玩家掷骰子,他被移动到新位置,这个位置被检查(在GameEngine里面)

class Field {
protected:          
    int m_positionID;
    float m_positionX;
    float m_positionY;    
    bool m_buyable;
public:
    Field() {}
    Field::Field(int positionId, float positionX, float positionY, bool buyable) :
        m_positionID(positionId), m_positionX(positionX), m_positionY(positionY), m_buyable(buyable) { }
    virtual ~Field() = default;
    virtual void calculateCharge(GameEngine&) = 0;
};

现在m_board.getField(m_gameEngine.getActivePlayer().getPositionID())->calculateCharge(); 将为每个类执行一个不同的操作,简单的运行时多态,但我希望这个函数实际调用calculateCharge()内部的一些函数,这就是为什么我要传递GameEngine&amp;进入这个函数,但是一旦我'#include GameEngine.h'进入'Field.h',我就得到了

  

错误C2504:'字段':基类未定义

后面是派生类的几个错误,他们无法访问成员(受保护)等,整个继承不再工作,并且在我遇到几个错误之后

  

致命错误C1903:无法从之前的错误中恢复;停止   汇编

我试图添加前向声明,但它没有帮助。我真的不知道如何解决这个问题。

0 个答案:

没有答案