0

我正在製作一個類似流氓的ASCII遊戲,並創建了一個名爲「Armor」的結構,我想在結構中使用name變量來獲取名稱所在的路徑。如何在它定義的同一個結構中使用一個變量?

struct Armor { 
    bool equipped; 
    std::string name; 

    int getBuff(int buff) { 
     std::fstream item; 
     std::string line; 
     std::string response; 
     std::string value; 

     item.open("../Data/Items/" + name + ".item", std::fstream::in); 
     if (item.fail()) 
      errorQuit("ERROR: There was a problem loading armor type .ITEM file."); // Error and quit function 

     while (!item.eof()) { 
      getline(item, line); 
      response = split(line, '=', 0); // Splits string 
      if (response == "buff" + std::to_string(buff)) { 
       value = split(line, '=', 1); 
       break; 
      } 
     } 

     item.close(); 
     return std::stoi(value); 
    } 

}; 

然後我把它叫做是這樣的:

Armor sword; 
    sword.name = "Wooden Sword"; 
    int buff = sword.getBuff(1); 

但是,這將引發未處理的異常錯誤。 我改變了它,所以getBuff需要2個參數,int buff和std :: string itemName。並用itemName替換路徑中的名稱; 後來我試着給它這樣的:

Armor sword; 
    sword.name = "Wooden Sword"; 
    int buff = sword.getBuff(1, sword.name); 

但是,這將引發同樣的錯誤。

我很困惑,爲什麼我不能使用名稱變量,因爲它已經被定義。有沒有其他的方式可以像這樣使用名稱變量?

+1

問題不在於變量'name'。 – deviantfan

+1

文件內容是否重要?如果是,請提供內容或使用stringstream對其進行模擬。如果不是,則刪除該部分以接近最小示例。另外,變量名稱在編譯爲二進制代碼後不再存在,但運行二進制代碼時引發異常,所以您猜測變量名稱可能是相關的,這是沒有根據的。 –

+0

分割功能是做什麼的?請發佈它的代碼。 –

回答

0

感謝您的幫助,但我想通了我自己。

我只是犯了一個愚蠢的錯誤,我忽視像一個白癡。

它正在文件中搜索buff + int(e.x. buff1),但是有多行包含該單詞,所以我猜測它已經搞砸了。我只是對if語句進行了調整,並且按預期工作。

抱歉打擾你!

-2

您的getBuf()函數在某些io操作上失敗並拋出異常。您不會處理異常,因此應用程序將退出相應的消息。嘗試圍繞呼叫使用try/catch來getBuf(添加包括對的iostream和stdexcept)

try { 
    int buff = sword.getBuff(1); 
} 
catch (const std::exception &e) { 
    std::cout << e.what() << std::endl; 
} 
+1

但問題是,當fstreams執行IO操作失敗時 - 它們只設置內部故障標誌,您可以通過方法檢索它們。他們不會拋出異常。 –

+0

如果打開失敗,則會引發異常,並且可以配置爲拋出其他情況。 關鍵是,應用程序因爲未處理的異常而失敗,並且處理程序將提供一些洞察信息 –

+0

但是,您必須手動配置ifstream才能引發異常。它不會默認這樣做。如果OP確實手動配置了ifstream來引發異常,那麼我認爲這將是他將會考慮的第一個地方。 –

1

我看你剛纔編輯您的評論說你想通你的問題,但我只是想添加別的東西可能會有所幫助:

沒有看到如何errorQuit()定義,有一個潛在的問題在您的getBuff()功能。如果表達式if (item.fail())的計算結果爲true,則該函數可能會繼續嘗試處理數據(除非errorQuit()以某種方式突破了程序或某種情況,這可能不是最佳方法)。

基本上,測試fail()可能會或可能不會提供您在所有情況下所需的行爲,具體取決於在流狀態中設置了哪些位。實現有所不同,但是...如果文件無法打開,將設置failbit和/或badbit,但不會設置eofbitgetline()將會看到錯誤狀態,因此當您調用它時,它不會嘗試從流中讀取數據。但這也意味着eofbit永遠不會被設置!

有很多不同的「技術」來文件閱讀。有些人更喜歡RAII方法。其他人喜歡在getline()上循環。或者你甚至可以使用good()來檢查錯誤狀態,如果你不在乎發生了什麼事情,只是想知道一切是否正常。

在任何情況下,您可能對本頁面的信息感興趣:std::ios_base::iostate

+0

errorQuit程序只是一個字符串,顯示它,等待用戶按任意鍵,然後退出程序退出(1) – Lunatoid

+0

@Lunatoid啊,好的。我不想在這裏脫離主題,但如果我至少沒有提到很多程序員嘲笑使用exit(),我會變成一個壞人。所以我只是把你引用到[這個有用的帖子](http://stackoverflow.com/a/30251056/5460182)。當程序變得更加複雜時,如果程序可以終止多個地方,事情會變得混亂。 – Dan

相關問題