2013-04-25 90 views
2

那麼,我想要做的是將我稱爲Block的類的對象推回到保存Block元素的不同向量上,並將它們保存在向量中。向量push_back:不轉換參數

std::vector<std::vector<Block>> mapvec; 
mapvec[xcnt].push_back(new Block(xcnt,ycnt)); 

這是我的進步,直到現在。

error C2664: 'std::vector<_Ty>::push_back': convetion of the parameter 'Block *' in 'const Block &' not possible 

(德國翻譯)

我應該怎麼辦?有什麼其他的方式去做我想要的嗎?不使用數組?

+3

擺脫新。 – hmjd 2013-04-25 17:54:47

回答

2

new返回一個指向動態分配對象的指針。這不是你想要在這裏做的。通常你想傳遞一個臨時(或已經存在的)對象到push_back,它會將一個副本插入到內存中。

所以,乾脆擺脫new。像這樣:

std::vector<std::vector<Block>> mapvec; 
mapvec[xcnt].push_back(Block(xcnt,ycnt)); 

這將使臨時Block -object並插入一個拷貝到載體中。

如果你想使用new你需要存儲在向量中的指針,而不是Block -objects。要做到這一點,最安全的方法是使用智能指針:

std::vector<std::vector<std::unique_ptr<Block>>> mapvec; 
mapvec[xcnt].push_back(std::unique_ptr<Block>(new Block(xcnt, ycnt))); 

這樣一來,用new分配將盡快使用delete當你從載體中刪除項目或矢量被破壞被釋放的內存。

+0

好的,謝謝你們,效果很好!你認爲可以問問題很容易在stackoverflow上回答嗎^^ – 2013-04-25 17:58:39

+0

沒問題,但你會發現類似的問題已經被多次回答了。請利用搜索功能,不要發佈其他問題的重複。只是表明你在向社區尋求幫助之前試圖自己找到答案。 – Excelcius 2013-04-25 18:01:40

+0

哦,如果其中一個答案幫助您解決了問題,請將其標記爲答案(不一定非要是我的答案)。 – Excelcius 2013-04-25 18:03:28

1

定義你的mapvec

std::vector<std::vector<Block*>> mapvec; 

呢?

+1

我聞到內存泄漏。 – Excelcius 2013-04-25 17:55:27

+0

@Excelcius考慮到問題是如何被問到的,這可能不是最安全的解決方案,但它解決了如何解決編譯器投訴問題。我同意你在答案中提供更好的解決方案。 – HonkyTonk 2013-04-25 19:17:12

+0

我並不是說你的解決方案是錯誤的,但它對我來說看起來像一個初學者問題,所以他可能不知道他必須調用刪除解決方案中的每個項目。 – Excelcius 2013-04-25 19:26:58

1
new Block(xcnt,ycnt) 

給你Block*指向新分配的Block。和你的矢量預計Block沒有Block*


將其更改爲

mapvec[xcnt].push_back(Block(xcnt,ycnt)); 

這將複製您Block到載體中,Block類應該有一個可訪問的拷貝構造函數。

0

您應該:

mapvec[xcnt].push_back(Block(xcnt,ycnt)); 

因爲你持有塊的實例,而不是他們的指針