【问题标题】:Store dynamically created objects in array C++将动态创建的对象存储在数组 C++ 中
【发布时间】:2019-05-27 15:41:27
【问题描述】:

我必须创建一个游戏。我有一个抽象的 Player 类。我有一个 GameEngine 类,它有一个指向 Player 的动态指针数组。每当添加一个玩家时,我都会对其进行分类并在 GameEngine 的“addPlayer()”方法中创建一个 Mage 或 Hero 对象(都是 Player 的子对象)。但是,在方法完成后,指针被破坏,如果我尝试访问 player 数组中的该项目,它会因“分段错误”而崩溃。我知道为什么会这样,但我不知道如何解决。我什至不确定这是否是完成这项工作的正确方法。你能给我建议吗?谢谢:)

编辑

这是一些示例代码:

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

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

【问题讨论】:

  • 如果您需要代码方面的帮助,您需要显示代码。请阅读minimal reproducible example
  • 对于超出其范围的对象,您可以通过std::shared_ptr 管理它们并将它们存储在容器中以供以后访问。

标签: c++ arrays object


【解决方案1】:

可能是这样的:

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 数据库中子类型的类型名称的内部设施。我的建议是在Player 类中提供GameEngine需要知道的所有功能,并让后代实现这些功能。

【讨论】:

  • 这可行,但程序会询问用户应该添加什么类型的播放器,并在 add 方法中解析输入以确定用户给出的类型。之后创建相应的播放器对象。例如,如果用户键入:“add shaman”,解析器将检测类型并创建一个 Shaman 对象。如果我将它的指针添加到数组中,并稍后尝试访问它,它会给出错误,因为指针在方法完成后被销毁。
猜你喜欢
  • 2013-12-16
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多