将指针放入unique_ptr后出现奇怪行为

时间:2019-05-05 21:23:49

标签: c++ new-operator unique-ptr

我正在用C ++进行游戏,在管理堆上的对象时遇到了一些麻烦。我有一个Ship班和一个Player班。 Player是多艘船的所有者,它具有船的unique_ptrs向量。 Player类的构造函数过去看起来像这样,并且运行良好:

$user->updated_events
//Player.h
std::vector<std::unique_ptr<Ship>> ship_vector_;

我要在代码中解决的问题是,在建造船只时,由于随机事件,船只可能会立即被摧毁。

如果一艘船在正常情况下死亡,它会要求Player类销毁自身,在这种情况下,它将某些ID变量传递给通过该矢量的函数,并擦除该对象。指针被破坏,飞船被释放。

到目前为止,还算不错,但是如果Ship在其构造函数中死亡,我将无法调用此函数,因为emplace_back函数尚未完成其工作,并且Ship还不存在。

为了解决这个问题,我在构造函数中编写了以下代码:

//Player.cpp
for(int i = 0, i < ships_to_set, i++)
  ship_vector_.emplace_back(
    std::make_unique<Ship>(random_, map_, Me()));

行为:乍一看似乎可行,但是如果我尝试调用函数,它似乎有所改变。例如。 char getCharacter()函数通常返回一个类似于'#'的符号,但这一次它返回下一个函数的输出,该函数返回一个信息字符串。

有快速解决方案还是我的结构不好?预先感谢您的任何想法。

编辑:

感谢您的评论! @PaulMcKenzie Ship接受了一个随机类的实例,为其提供了其产卵位置等值。例如,可以在矿山上产卵,但是还有许多其他机制可能导致船舶死亡。我想让舰队负责检查这些。

@Swordfish我的飞船无法复制,只能建造一次,这就是为什么我希望将它们放在堆上。基本上,地图由字段组成。除其他属性外,每个字段都可以具有Ship指针。每艘船都已协调并负责将自己的指针放置在地图上,这很好用,因为我可以问地图:在(5,5)给我船,我也可以要求船的位置,我不不会改变这一点。我认为我无法在不复制的情况下处理带有删除项目的矢量,对吗?

@ 1201ProgramAlarm不,舰船不在乎其他实例的数量。

0 个答案:

没有答案