Хранить динамически созданные объекты в массиве C ++ - PullRequest
0 голосов
/ 27 мая 2019

Я должен создать игру.У меня есть класс Player, который является абстрактным.У меня есть класс GameEngine, который имеет динамический массив указателей на игрока.Каждый раз, когда добавляется игрок, я классифицирую его и создаю объект Mage или Hero (оба потомка Player) в методе addPlayer () в GameEngine.Тем не менее, после завершения метода указатель уничтожается, и если я пытаюсь получить доступ к этому элементу в массиве игроков, он падает с «ошибка сегментации».Я знаю, почему это происходит, но я не знаю, как обойти это.Я даже не уверен, что это правильный способ сделать это.Можете ли вы дать мне совет?Спасибо:)

РЕДАКТИРОВАТЬ

Это пример кода:

class GameEngine {
    ...
    Player** players;
    ...
    void addPlayer() {
        Hero h("Frodo");
        players[playerCount] = &h;
        playerCount++;
    }
}

class Player { ... }
class Hero : public Player { ... }

1 Ответ

1 голос
/ 27 мая 2019

Может быть, что-то вроде этого:

class Player
{
  public:  
    virtual std::string& get_name() const = 0;
};

class GameEngine
{
  public:  
    std::vector<Player *> m_players;

    void  add_player(Player * p)
    {
      m_players.push_back(p);
    }
};

Выше суть вашего вопроса. add_player добавляет игрока в вашу базу данных.

Более широкий взгляд:

class Shaman
: public Player
{
  std::string m_name;
  public:
    virtual std::string& get_name() const
    {
       return m_name;
    }
  Shaman()
    : m_name("Bubba")
  { ; }
};

Выше приведен пример класса, производного от Player.

Фрагмент кода для создания динамического экземпляра и добавления в GameEngine:

Shaman * p_bubba = new Shaman;
GameEngine game;
game.add_player(p_bubba);

Помните, что класс GameEngine знает только об открытых функциях и членах в Player. В C ++ нет внутренних средств для извлечения имени типа дочерних типов в базе данных m_player. Я рекомендую предоставить все функции, которые GameEngine должен знать в классе Player, и позволить потомкам реализовать эти функции.

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