正确使用具有用户定义类型的 std::vector.push_back()

proper use of std::vector.push_back() with a user defined type

本文关键字:vector std push back 类型 定义 用户      更新时间:2023-10-16

我目前的 vector.push_back() 方法遇到了分割错误(我认为)。

下面是一些示例代码:

所以我有我的班级僵尸

class Zombie
{
    public:
       Zombie();
       ~Zombie();
       SDL_Surface* image;
       SDL_Rect box;
       bool dead;
   protected:
   private:
       // gets random coordinates around the screen
       SDL_Rect get_zombie_rect();
 };

构造函数为:

Zombie::Zombie()
   :
   dead(false),
   image(load_image("Player.png")),
   box(get_zombie_rect())
{
}

Zombie 有一个处理程序类来管理向量,使用一个名为 create_new_zombie() 的函数。(这是问题所在)

void Zombie_Manager::create_new_zombie()
{
   Zombie newZombie;
   zombies.push_back(newZombie);
}

这是向向量添加元素的正确方法吗?

我能够使用指针获得工作版本,但必须有一种更简单、更正确的方法来实现这一目标,对吧?

如果 std::vector.push_back() 浅层复制其新元素,为什么会出现 seg 错误?我假设错了吗?

您需要实现复制构造函数和赋值运算符。

zombies.push_back(newZombie);在向量中推送newZombie的副本。当方法进入时,原始newZombie将被销毁。我敢打赌,在你称~Zombie() delete image;.

由于您没有正确的复制构造函数和赋值运算符,因此所有副本都将无效,因为它们将包含悬空指针。

始终遵循三法则 - 如果需要实现析构函数,则还需要实现 c-ctor 和赋值运算符。

相关文章: