error: 'object' was not declared in this scope

I am pretty new at c++ and trying to make Monopoly game. Unfortunately it still shows me error in declaration between two classes. I've already tried everything and really have no idea where the problem can be.

The error: 'Player' is not declared in this scope.

Engine.h

#ifndef ENGINE_H
#define ENGINE_H
#include "Player.h"
#include <vector>
using namespace std;
class Engine{
public:
    Engine(); // method that starts with game, take random number for getting number of players, set players to vector
    void play(); // method where players are playing.
    bool returnBalance(int a_money) const; // method that return True, if the players has still some amount on account, False otherwise
    bool isWinner();
    int setBalance(); // method that set curretn player amount
    void printWinner(); // method that print winter of the game
    void payBills(int amount); // player pay any bills with this method
    virtual ~Engine();
private:
    vector<Player*> players;
    int i_player;
    int balance;
    int currentPlayer;
};
#endif /* ENGINE_H */

Engine.cpp

#include "Engine.h"
#include <iostream>
#include <stdlib.h>
using namespace std;

Engine::Engine() {
    int numPlayers = rand()*(6-2)+2;
    for (int i = 0; i <= numPlayers; i++){
        Player* p = new Player;
        players.push_back(p);
    }
     cout << players.size() << endl; 

    int p_index = 0; 
     for(int i = 1; i <= players.size(); i++){
         p_index = i;
         p_index++;
         cout << p_index ;
     }
    currentPlayer = p_index;     

    cout << "Welcome to MonOOpoly game, the game will be played in the same order you already are." << endl;
}

void Engine::play() {
    do{

    }while(!isWinner());
}

bool Engine::isWinner(){
    int count = 0;
    for(int i = 1; i <= players.size(); i++){
        if(players[i]->getAmount() > 0)
            count++; 
    }
    if(count <= 1)
        return true;
    return false;

}

int Engine::setBalance(){
    int amount = players[currentPlayer]->amount;
    return players[currentPlayer]->amount;
}

bool Engine::returnBalance(int a_money) const{
    if (players[currentPlayer]->amount < a_money)
        return false;
    else 
        return true;
}

void Engine::payBills(int amount) {
    players[currentPlayer]->amount = players[currentPlayer]->amount - amount;
}

void Engine::printWinner() {
    int winner = 0;
    int newWinner = 0;
    for(int i = 1; i <= players.size(); i++){
        if(players[i] > 0){
            winner = players[i]->getAmount();
            if(newWinner < winner)
                newWinner = winner;
        }
    }
    cout << "Winner of the game MonOOpoly is: " << newWinner << endl;
}

Engine::~Engine() {
}

Player.h

#ifndef PLAYER_H
#define PLAYER_H
#include "Engine.h"
#include <string>
using namespace std;

class Player {
    friend class Engine;
public:
    Player(); // constructor
    int getAmount() const; // return how much of amount the player has yet
    void setAmount(int a); // set amount
    int getPosition() const; // return position of the player
    void setPosition(int p); // to set position
    virtual ~Player(); // destructor
private:
    int position; // the position of the player
    int amount; // the total amount
};


#endif /* PLAYER_H */

Player.cpp

#include <iostream>
#include <stdlib.h>
#include "Player.h"
using namespace std;

Player::Player() {
    amount = 5000;
    position = 0;
}

int Player::getAmount() const {
    return amount;
}

void Player::setAmount(int a) {
    amount = a;
}

int Player::getPosition() const {
    return position;
}

void Player::setPosition(int p) {
    position = p;
}

Player::~Player() {
}

Upvotes: 4

Views: 8883

Answers (1)

tinkertime
tinkertime

Reputation: 3042

You have circular includes in your headers, likely causing the compiler issues you're seeing. Engine.h includes Player.h and Player.h includes Engine.h

You should:

  • move the #include Player.h from Engine.h to Engine.cpp
  • forward declare the Player class in the Engine.h (with a class Player;) line.

Forward declarations are useful here since Engine.h only needs to know the some Player class exists and not it's entire definition, since it just defines a simple vector of pointers to that class.

Upvotes: 4

Related Questions