[問題] vector push_back() 多個物件執行錯誤

看板C_and_CPP (C/C++)作者 (522)時間13年前 (2013/01/07 16:19), 編輯推噓2(2014)
留言16則, 5人參與, 最新討論串1/1
各位高手們好,我想請問一下關於vector的問題 因為我在做的遊戲中會有怪物,之前我在測試時是用new的方式來創怪 int MONSTER_COUNT=3; Enemy *monster[MONSTER_COUNT]; for( int i=0 ; i<MONSTER_COUNT ; ++i) monster[i]=new Enemy("Ms_01.png",100,100) //第二、三參數是座標 然後每隻怪物的動作我是這樣寫 for( int i=0 ; i<MONSTER_COUNT ; ++i) monster[i]->action(); 這樣子都沒有任何問題,可是假設第2隻死掉了,我要把第2隻給delete掉 但delete會把全部monster都刪掉,所以想說改成用vector來實做 不過一測試就遇到許多奇怪的問題 Enemy monster_temp("Ms_01.png",100,100); vector<Enemy> monster; monster.push_back(monster_temp); for(vector<Enemy>::iterator iter = monster.begin(); iter != monster.end(); ++iter) iter->action(); 我如果只有push_back一筆資料就會正常,怪物也可以draw出來 可是如果push_back兩筆怪物不知道為什麼會draw不出來 push_back三筆一執行就會當掉 想請問各位高手們是不是vector有什麼部份我沒有注意到的? 因為我用new的方式都會正常,可是改成vecotr就會出錯 讓我連一點頭緒都沒有,謝謝各位的幫忙 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.134.49.54

01/07 16:29, , 1F
你可以檢查一下 Enemy 的 copy constructor 有沒有寫好
01/07 16:29, 1F

01/07 16:31, , 2F
另外建議你用 vector<Enemy *> 搭配 new Enemy(...)
01/07 16:31, 2F

01/07 16:31, , 3F
九成九是沒寫copy-ctor和operator=
01/07 16:31, 3F

01/07 16:34, , 4F
copy也是有問題的,會析構,還是shared_ptr吧
01/07 16:34, 4F

01/07 16:36, , 5F
你也可以用 move constructor + move assignment operator
01/07 16:36, 5F

01/07 16:38, , 7F
就算宣告成 vector<Enemy> 也不會呼叫多餘的 ctor/dtor
01/07 16:38, 7F

01/07 17:38, , 8F
原來是要寫copy-ctor@@我這個完全沒有寫,我以為會把
01/07 17:38, 8F

01/07 17:39, , 9F
monster_temp拿去做ctor,感謝各位的幫忙
01/07 17:39, 9F
各位講的專有名詞好多我都沒看過,真尷尬 可是可以請問一下為什麼要用operator=嗎? 謝謝各位 ※ 編輯: yoll522 來自: 1.169.116.94 (01/07 17:40) ※ 編輯: yoll522 來自: 1.169.116.94 (01/07 17:42)

01/07 18:08, , 10F
當vector分配給目前內容物的記憶體已滿、又加入新元素
01/07 18:08, 10F

01/07 18:08, , 11F
的時候,就會另外配置一塊夠大的記憶體,然後把原本的
01/07 18:08, 11F

01/07 18:09, , 12F
元素們copy過去,這時後就會用到operator=或copy ctor
01/07 18:09, 12F

01/07 18:10, , 13F
哦我差點忘記其實STL container中元素的取出和存入就會
01/07 18:10, 13F

01/07 18:10, , 14F
用到了
01/07 18:10, 14F
感謝你的說明 不過vector在copy過去的時候會執行operator=或copy ctor 意思是他在copy時會兩種都有可能會執行嗎? ※ 編輯: yoll522 來自: 1.169.116.94 (01/07 19:22)

01/07 20:26, , 15F
01/07 20:26, 15F

01/08 21:36, , 16F
這範例真的是太讚了,感謝你的教學,也謝謝其他人
01/08 21:36, 16F
文章代碼(AID): #1GweKOcv (C_and_CPP)
文章代碼(AID): #1GweKOcv (C_and_CPP)