2014-11-21 82 views
0

我有一個Player類,其中Class類型的每個對象都有一個名稱,獲勝,損失和繪製。 Player類的每個對象都是通過調用the_player = new Player(the_name)創建的。當用戶輸入一個新的名字來爲程序添加一個Player對象時,一個指針被壓入一個向量AllPlayers中。在推動新指針之前,程序應檢查所需播放器不存在於所述矢量中。我必須在整個程序中檢查幾次,所以我想我會爲它寫一個函數。這裏是我的功能:搜索對象指針的向量

int findPlayer(vector<Player*> &vals, string name_in) 
{ 
    for (int i = 0; i < vals.size(); i++){ 
     if (vals[i]->getName() == name_in){ 
      cout << vals[i]->toString() << endl; 
      return i; 
     } 
     else 
      return -1; 
    } 
}; 

當選項被要求增加一個新的播放器下面的代碼被用於:

do { 
    cout << "Name: "; 
    cin >> the_name; 

    if (findPlayer(AllPlayers, the_name) != -1){ 
     cerr << "Player already exists\n"; 
    } 
} while (findPlayer(AllPlayers, the_name) != -1); 

the_player = new Player(the_name); 
AllPlayers.push_back(the_player); 

出於某種原因,不過,每次我嘗試添加一個新的播放器它會拋出「玩家已經存在」並且永遠不會離開do-while循環。當AllPlayers矢量爲空時,情況更是如此。我爲調試添加了一個cout < < < findPlayer(AllPlayers,the_name),並且它打印了4192252,我認爲它是向量中可能的最大元素。

所以問題是:爲什麼它返回4192252而不是-1?

+1

您是否啓用了編譯器警告?我會警告導致此問題的錯誤。 – user2079303 2014-11-21 08:30:29

+1

您是否使用調試程序遍歷代碼? – 2014-11-21 08:33:37

回答

0

這一發現播放器的功能應該是這樣的:

int findPlayer(vector<Player*> &vals, string name_in) 
{ 
    if(vals.size() == 0) 
     return -1; 

    for (int i = 0; i < vals.size(); i++){ 
     if (vals[i]->getName() == name_in){ 
      cout << vals[i]->toString() << endl; 
      return i; 
     } 
    } 
    return -1; 
}; 
+0

這將問題解決爲0%。你返回-1,它仍然打印出一個錯誤。 – Blacktempel 2014-11-21 09:22:36

+0

@Blacktempel:只有找不到;如果是,返回我返回一些其他值。這是正確的,儘管最初的測試毫無意義。 – 2014-11-21 10:34:12

+0

這解決了它。給它一個向量中沒有任何東西的基本情況下拋出-1,這意味着在矢量中找不到指定的名稱,這是正確的。 – Spencer 2014-11-21 14:27:10

3

你認爲,如果vals爲空,findPlayer將返回什麼?

定義了嗎?

+3

儘管它直接回答了答案,但這應該是一個評論。爲upvote添加解釋。 – molbdnilo 2014-11-21 08:30:37

+2

我沒有聲望發表評論。我必須有50. :) – Neska 2014-11-21 08:34:44

4

如果vals爲空,那麼for循環永遠不會輸入,函數將退出而不會觸及return語句。這意味着你得到一個隨機值,而在這種情況下,4192252恰好在返回寄存器中。如果你閱讀它們,你的編譯器警告會告訴你。

+0

我在Visual Studio 2013.我必須假設警告已啓用,因爲我總是收到很多警告(新的C++),但沒有任何顯示在這一個。 – Spencer 2014-11-21 14:24:06

+0

@Spencer您將看到[此警告(C4715)](http://msdn.microsoft.com/zh-cn/library/6deaf4k9.aspx)這是一級警告,因此應該在所有警告級別都可見。如果你想讓編譯器幫助你找到像這樣愚蠢的東西,你應該開始用'/ WX'編譯來將警告視爲錯誤。 – sjdowling 2014-11-21 15:27:43

0

重寫功能通過以下方式

bool findPlayer(const std::vector<Player*> &vals, const std::string &name_in) 
{ 
    std::vector<Player*>::size_tyoe i = 0; 

    while (i < vals.size() && vals[i]->getName() != name_in) ++i; 

    return i != vals.size(); 
} 

要考慮到成員函數getName必須與預選賽const定義。

至於你的函數,當矢量爲空時它不返回任何東西,或者當矢量的第一個元素與字符串不一致時返回-1。

考慮到在標頭<algorithm>中聲明的標準算法std::find_if可以用來代替您的函數。

1

如果矢量爲空,則根本不輸入循環,因此不要到達return語句並且不返回有效值。您應該啓用編譯器警告來捕獲此錯誤。

否則,您只檢查第一個項目,並立即返回它是否匹配。如果找不到匹配項,則要返回,但如果不匹配則只返回-1:

for (int i = 0; i < vals.size(); i++){ 
    if (vals[i]->getName() == name_in){ 
     cout << vals[i]->toString() << endl; 
     return i; 
    } 
} 
return -1;