繁体   English   中英

C ++向量指针问题/向量中对象的指针向量

[英]C++ Vector pointer problems/Vector of pointers to a object in a vector

因此,似乎很多C ++新手都对向量有疑问,因为他们对向量有很多疑问。 我对C ++并不是很陌生,但是我从来没有遇到过这个问题。 无论如何,所以我的问题是矢量指针。 我正在制作带有可容纳物体的向量的视频游戏。 它拥有对对象的引用,因此可以在碰撞函数内部进行碰撞响应。 为了加载向量,我曾经做过这样的事情:

Object a = Object(12, 135, 123, 124);
collision_rects.push_back(&a);

这样就可以完美地工作,但是我不想键入每个对象,所以我做了一个函数,可以像这样从文本文件中读取它。

void get_from_file()
{ 
//Blah blah read numbers from file.
//then I would get the numbers and make a object from them.
Object a = Object(numbers from file);
collision_rects.push_back(&a);
}

但是这样做没有用! 我跌倒了! 如果我采用相同的数据并以第一种方式加载它,则它可以正常工作,但是当我从文本文件中的函数中进行加载时,它却无法正常工作。 然后,我意识到也许是因为对象超出范围。 因此,我尝试使对象成为全局对象,然后在函数中执行相同操作,此方法起作用。 这实际上与第一个选项相同,但在功能上。 因此,我在相同的范围内制作了两个向量,这样原始对象就不会超出范围。

std::vector<Object> objects;
void get_from_file()
{
//blah blah
objects[i] = Object(nums from file); //reading from numbers in a for loop
collision_rects.push_back(&objects[i]); //This throws weird

这也没有用。(顺便说一下,这甚至与实际代码还不很接近,只是该代码基本功能的一个示例。我在做什么错了?谢谢。 编辑,所以我不知道我是否解释了它。完美,但是我不认为它指向已删除对象的问题,这肯定会使它不起作用,但这也是我相信的另一个原因。

player->cHandler.objects.push_back(&uno); player->cHandler.objects.push_back(&dos); player->cHandler.objects.push_back(&tres); player->cHandler.objects.push_back(&quatro); player->cHandler.objects.push_back(&cinco); player->cHandler.objects.push_back(&seis); player->cHandler.objects.push_back(&a8); player->cHandler.objects.push_back(&a9); player->cHandler.objects.push_back(&a10); player->cHandler.objects.push_back(&a11); player->cHandler.objects.push_back(&a12); player->cHandler.objects.push_back(&a13); player->cHandler.objects.push_back(&a14); player->cHandler.objects.push_back(&a15); player->cHandler.objects.push_back(&a16); player->cHandler.objects.push_back(&a17); player->cHandler.objects.push_back(&a18); player->cHandler.objects.push_back(&a19); player->cHandler.objects.push_back(&a20); 现在,这是我的实际代码。 但是,当我这样做时,它不起作用。

objs.push_back(uno); objs.push_back(dos); objs.push_back(tres); objs.push_back(quatro); objs.push_back(cinco); objs.push_back(seis); objs.push_back(a8); objs.push_back(a9); objs.push_back(a10); objs.push_back(a11); objs.push_back(a12); objs.push_back(a13); objs.push_back(a14); objs.push_back(a15); objs.push_back(a16); objs.push_back(a17); objs.push_back(a18); objs.push_back(a19); objs.push_back(a20); for (int i = 0; i < objs.size(); i++) { //player->cHandler.objects.push_back(&objs[i]); } objs.push_back(uno); objs.push_back(dos); objs.push_back(tres); objs.push_back(quatro); objs.push_back(cinco); objs.push_back(seis); objs.push_back(a8); objs.push_back(a9); objs.push_back(a10); objs.push_back(a11); objs.push_back(a12); objs.push_back(a13); objs.push_back(a14); objs.push_back(a15); objs.push_back(a16); objs.push_back(a17); objs.push_back(a18); objs.push_back(a19); objs.push_back(a20); for (int i = 0; i < objs.size(); i++) { //player->cHandler.objects.push_back(&objs[i]); }这不起作用,我也不知道为什么。

您的问题与std::vector无关。 您只能通过使用vector发现潜在的问题,但是如果返回指向创建的对象的指针,或者具有简单数组并将指向该对象的指针存储在数组中,则会遇到同样的问题。

您正在存储指向局部变量的指针:

void get_from_file()
{ 
    Object a = Object(numbers from file);
    collision_rects.push_back(&a);
}

get_from_file()函数返回时, a将被销毁,因为它是本地对象。 因此您的collision_rects向量将具有指向不再存在的变量的指针。

此代码将发生相同的问题:

Object* get_from_file()
{ 
    Object a = Object(numbers from file);
    return &a;  // returning pointer to local variable.  Bad.
}

因此,解决方案是确保对象的生存期存在于get_from_file函数之外。

您可以将对象存储在向量中( std::vector<Object> ),或者如果它必须是指针,则它应该是指向寿命超过get_from_file()函数的对象的指针。 这可以通过使用new或更好的方法(使用智能指针类型)从堆中分配来实现。

您正在存储一个指向对象的指针,但是这些对象随后被销毁,因此留下的指针什么都没有。

一种不错的选择是将对象本身存储在向量中,而不是指针中。

或者,您可以在堆上分配一个对象(例如使用new Object(1, 2, 3) )并存储该指针(这样,直到您希望对象销毁后,该对象才被销毁)。 如果这样做,我建议您存储shared_ptrunique_ptr它们为您完成了很多工作,并使编写正确的代码更加容易。

如果可以确定std::vector销毁后销毁std::vector中的对象,可以将它们存储在std::vector<Object> ,并使用emplace_back直接在vector中构造它们,而无需临时局部变量:

std::vector<Object> collision_rects;
collision_rects.emplace_back(nums from file);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM