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

Bry*_*ard 3 c++ class vector

我用我当前的vector.push_back()方法得到了分段错误(我认为).

这是一些示例代码:

所以我有我的班级Zombie

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();
 };
Run Code Online (Sandbox Code Playgroud)

构造函数是:

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

}
Run Code Online (Sandbox Code Playgroud)

和Zombie有一个处理程序类来管理带有一个名为create_new_zombie()的函数的向量.(这是问题)

void Zombie_Manager::create_new_zombie()
{
   Zombie newZombie;
   zombies.push_back(newZombie);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Luc*_*ore 9

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

zombies.push_back(newZombie);推送newZombie矢量中的副本.当方法进入时,原件newZombie被销毁.而且我愿意打赌~Zombie()你打电话delete image;.

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

始终遵循三条规则 - 如果需要实现析构函数,还需要实现一个c-ctor和赋值运算符.

  • 由于对象包含原始指针,因此它需要是*深*副本.或者更好的是使用`shared_ptr`. (2认同)
  • 它确实是@ 0A0D,但它做的是浅拷贝.副本中的指针"图像"指向与原始位置相同的位置.因此,当原始的一个被销毁时,副本中的指针将悬空. (2认同)