簡體   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