2011-11-25 46 views
2

首先,我很抱歉,如果標題不正確的描述我的問題,但我想不出一個更好的。 =/C++如何跟蹤局部變量/對象

我試圖做一個遊戲,我需要在屏幕上繪製所有的實體是一個演員類的子類。

演員類有一個名爲「虛擬void drawMe()」的虛擬函數,它由子代覆蓋以指定應如何繪製。

人體工程學,在遊戲循環的結束,我想提請所有行動者。我創建了一個「矢量allActors」來幫助我這個,每次我創建一個新的演員,我這樣做:「allActors.push_back(& newActor)」。到目前爲止這麼好(我認爲)。

要在循環結束時繪製它們,我遍歷allActors中的所有元素,併爲每個元素調用「allActors [i] - > drawMe()」。

但我發現,這種方法不會爲我本地創建,像子彈字符芽(他們是內部的if語句創建)時創建的演員的工作。 我認爲這是因爲當我在allActor矢量中保存子彈的地址時,演講者本身在if語句結束後被銷燬,所以這是一個無用的地址。

例如:

if (characterShot == true) 
{ 
    Bullet newBullet; 
    allActors.push_back(&newBullet); 
    characterShot = false; 
} 

我不知道該怎樣做到這一點的方式,它的作品,因爲我只能創建子彈演員在角色芽的想法!

請幫我找出一個更好,更實用的方式做我想做的。

預先感謝您!

+0

我喜歡你對這個問題的想法。這是一個初學者的問題,但我只希望所有初學者都仔細考慮,並花時間耐心地提問。你會很快到達那裏! – sehe

回答

2

動態分配對象:

allActors.push_back(new Bullet); 

注意,壽命管理將是一個真正的惡夢;你應該使容器元素成爲某種智能指針(最好是std::unique_ptr<Bullet>或者一些合適的基類)。

+0

呵呵 - 總是樂觀主義者。不是一場噩夢......如果所有的指針都是由矢量所擁有的,那麼只要記住在刪除時刪除項目(並且在破壞矢量之前刪除所有項目)。這可能是一個(容易出錯的)雜事,所以智能指針有很多幫助。 – sehe

+0

@sehe:是的,也許:-)考慮到OP在家中似乎沒有100%的動態與自動存儲的概念,我讓我的想象力瘋狂起來......但是你是對的,它是完全有可能她的代碼完全沒問題! –

+0

謝謝大家的回覆,我之前從未使用動態對象分配。有效!我仍然想知道你們對智能指針的看法,但是我會去那裏! =) 注:我是他。大聲笑 – DaedalusCoder

0

你就在你的假設,即你推一個地址到本地對象,那麼超出範圍。這樣做會導致您的應用程序非常不穩定。

分配對象上堆相反,使用智能指針跟蹤對象的生命週期中對您:

allActors.push_back(tr1::shared_ptr<Bullet>(new Bullet)); 

這給了你一個問題:你必須從allActors取出子彈陣列擊中目標後。