2011-11-08 24 views
0

從我剛纔的問題,它現在已經解決了攜帶上: Issue with Pointers (Only in Release Build)矢量數據被重置?

進行必要的更改我創建的敵人的方式後,我也不得不改變對象如何等與敵人明顯的原因互動。 但現在看來我又犯了一個錯誤:/

在這裏我有一些代碼用於創建我的投射物來擊中敵人,但是這個代碼雖然做了相反的處理並且在短時間內阻止了敵人的時間。

if ((enemies[numOfEnemies].position.x + (enemies[numOfEnemies].width/2) > bullet.position.x && 
      enemies[numOfEnemies].position.x < bullet.position.x + bullet.width) && 
      (enemies[numOfEnemies].position.y + (enemies[numOfEnemies].height/2) > bullet.position.y && 
      enemies[numOfEnemies].position.y < bullet.position.y + bullet.height) && 
      enemies[numOfEnemies].speed != 0) 
     { 
      //We've collided with the wall, stop the enemy 
      enemies[numOfEnemies].previousSpeed = enemies[numOfEnemies].speed; 
      enemies[numOfEnemies].speed = 0; 
     } 

正如你所看到的,簡單的東西。但似乎敵人矢量不斷重置,不確定這裏發生了什麼。之前,再次工作得非常好,從指針變成矢量現在已經產生了這個問題:/。

void Towers::Update(std::vector<Enemies> enemies, SDLib& lib, Map cMap) 

多數民衆贊成我是如何通過向我的職能向量。矢量是否超出了範圍,然後被自動清除?如果是這樣,那麼我需要做些什麼來分配我對實際數據所做的更改?

任何幫助表示讚賞!

+0

你是什麼意思「不斷重置」?你能發佈一些完整的代碼來證明問題嗎? –

+0

'numOfEnemies'給我建議它是向量中的敵人數量。如果是這樣,它絕對不是一個有效的索引。但是,這可能只是一個命名不清的範圍內的索引。 – celtschk

+0

此外,您的編碼風格很糟糕(可能)不太理想。您應該將索引操作符的調用次數減少到最低限度 - 只需將局部變量(可能是引用)中的'enemies [numOfEnemies]'的值存儲起來,然後在成員函數中引用它。 – gwiazdorrr

回答

3

除非另有說明,否則C++函數參數是傳遞值。這意味着您的功能在矢量的副本上運行。把它修改原始,你需要按引用傳遞:

void Towers::Update(std::vector<Enemies> &enemies, SDLib& lib, Map cMap) 
             ^
+0

謝謝,現在按預期工作。 :) – Danran

1

您是按值,這意味着它(包括其內容),它被傳遞到每個時間被複制通過你的std ::矢量功能。如果你想在update()函數,以便能夠改變矢量(的內容),您需要通過參考通過它

void Towers::Update(std::vector<Enemies> &enemies, SDLib& lib, Map cMap) 

你的代碼的其餘部分可以最有可能保持不變,因爲引用 - 與指針相反 - 不需要顯式的解引用。

1

您將向量傳遞給您的函數的值。所以調用函數中的原始矢量將永遠不會被修改。試試這個代碼顯示問題:

#include <vector> 
#include <iostream> 

int domod(std::vector<int>& v) { 
     v[0] = 2; 
} 

int donotmod(std::vector<int> v) { 
     v[0] = 2; 
} 

int main(void) { 
     std::vector<int> v; 

     v.push_back(1); 

     donotmod(v); 
     std::cout << v[0] << std::endl; 

     domod(v); 
     std::cout << v[0] << std::endl; 

     return 0; 
}