[英]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_ptr
或unique_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.