Класс не называет ошибку типа в коде C ++ - PullRequest
0 голосов
/ 12 июля 2020

Я пытаюсь создать небольшую игру на C ++, и у меня уже возникают проблемы с добавлением моего класса Player в мой класс Game. Я думал, что это проблема с круговой зависимостью, но предварительное объявление класса не помогло! Я искал везде и просто не мог понять этого, поэтому надеюсь понять, почему это не работает. Я включаю только заголовки, потому что все, что у меня есть в исходном коде на данный момент, - это определения моих конструкторов "

Game.h

#ifndef GAME_H_INCLUDED
#define GAME_H_INCLUDED

#include "Player.h"

//only one instance of a game should be running
//make singleton class
class Game {
private:
    bool playing;
    Player * Player = 0;
    static Game * inst;
    Game() {}
public:
    Player * GetPlayer() { return Player; } //Getting a "Player does not name a type" error here???
    void AddPlayer(int health, int mana, int strength) { Player = new Player(health, mana, strength)}
    bool StillPlaying() { return playing; }
    void EndGame() { playing = false; }
    static Game * GetInstance();
    void StartGame();
};

#endif // GAME_H_INCLUDED

Player.h

#ifndef PLAYER_H_INCLUDED
#define PLAYER_H_INCLUDED

#include "Subject.h"

class Player : public Subject {
protected:
    int health;
    int mana;
    int strength;
public:
    Player(int health, int mana, int strength);
    int GetHealth() { return health; };
    int GetMana() { return mana; }
    int GetStrength() { return strength; }
    void TakeDamage(int enemyStrength) { health -= enemyStrength; }
    void Attack();
    void Heal();
    void Event();
};

#endif // PLAYER_H_INCLUDED

Ошибки обнаруживаются в файле Game.h, и в частности, в нем говорится, что «Player 'не называет тип» в функции GetPlayer (). I я действительно запутался, потому что не выдает мне ошибку, когда я объявляю переменную-член Player ??

1 Ответ

1 голос
/ 12 июля 2020

У вас есть класс Player и член Game с именем Player. Как только объявление члена обнаружено, все ссылки на Player в классе Game будут относиться к переменной-члену, а не к глобальному типу.

Есть способы обойти это (например, ::Player *GetPlayer ), но лучшим и наименее запутанным исправлением было бы переименование переменной-члена или типа, чтобы получить другое имя.

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