2016-04-03 42 views
0

如果沒有提供文件名,我想使用默認值。或者,如果提供文件名但文件無法訪問,請使用默認值。當我的變量肯定被使用時未使用的變量錯誤

int main(int argc, char * argv[]) { 

    // default settings 
    bool flag = false; 
    string fileName = "defaultMap.txt"; 
    ifstream *infile = new ifstream(fileName); 

    if (argc > 1) { 
     fileName = argv[i]; // otherwise, it is a file name 
     flag = true; 
     delete infile; 
     ifstream *infile = new ifstream(fileName); 

     //if file is not valid: 
     if (!infile->good() || infile->fail()) { 
      cout << "Problem loading board from map file \'" << fileName << "\'." << endl; 
      delete infile; 
      flag = false; 
     } 
    } 

    if (!flag) ifstream *infile = new ifstream("defaultMap.txt"); //change back to default 

    Board * grid = new Board(*infile, playerRace, flag); 

    // MORE STUFF FOR MAIN HERE 
} 

然後,我將文件發送到一個函數中,逐字符地讀取它以填充矩陣。 Board()僅被調用一次,而boardInit在每次玩家進入新房間時被調用,並且需要從文件中讀取更多信息。

Board::Board(ifstream & fileName, string race, bool flag) { 
    player = new Player(race); 
    boardInit(fileName, race, flag); 
} 



void Board::boardInit(ifstream & fileName, string race, bool flag) { 

    char cell; 
    game = new Cell*[maxRow]; 
    for (int row = 0; row < maxRow; row++) { 
     game[row] = new Cell[maxCol]; 
     for (int col = 0; col < maxCol; col++) { 
      fileName.get(cell); 
     } 
    } 
     // MORE STUFF FOR boardINIT here 
} 

當我嘗試編譯我的錯誤

main.cc:122:23: error: unused variable 'infile' [-Werror,-Wunused-variable] 
     if (!flag) ifstream *infile = new ifstream("defaultMap.txt"); //change back to default 
          ^
1 error generated. 

即使我把它傳遞給板右下方(Board * grid = new Board(*infile, playerRace, flag);

+0

嘗試更改'ifstream * infile = ...'到'infile = ...' – anukul

+1

首先,停止使用'new',除非您有充足的理由,而您的代碼中沒有這個理由。其次,C++具有嵌套作用域,變量名只能在其範圍內唯一。想象一下,如果條件仍然不明確,那麼可以使用大括號。最後,你的問題是無關緊要的,因爲你沒有把它減少到顯示問題的代碼量越來越少。這可能會給你自己正確的想法而沒有問。 –

+0

@momo爲什麼不把它變成答案,解釋發生了什麼? – juanchopanza

回答

2

您正在使用相同的名稱隱藏你的一個變量。

int main(int argc, char * argv[]) { 

    // default settings 
    bool flag = false; 
    string fileName = "defaultMap.txt"; 
    ifstream *infile = new ifstream(fileName); // <-------------- HERE 

請參閱?你先定義它,然後在if語句中不使用它,因爲你用這個名稱創建了一個新變量,隱藏了infile在主要的頂部。因此,infile裏面的if語句有它的生命週期在if (!flag)範圍月底結束,因此將不再存在,你從頂部infile變量會再次出現:

if (!flag) ifstream *infile = new ifstream("defaultMap.txt"); //change back to default 

使用之前的變量簡單地穿上」噸,新變量的聲明隱藏,只需要使用以前:

if (!flag) infile = new ifstream("defaultMap.txt"); //change back to default 

另外:

  • Consi DER改變"defaultMap.txt"到字符串常量:

    static const string defaultFileName = "defaultMap.txt"; 
    string fileName = defaultFileName; 
    
    // ... and later: 
    
    if (!flag) infile = new ifstream(defaultFileName); //change back to default 
    
  • 考慮使用智能指針,因爲它是2016年了。看看shared_ptrunique_ptr

  • 想想看看你自己的代碼,你有很多重構要在這裏完成,這將大大簡化你的代碼,並使人們更容易閱讀和理解。

+0

我明白了。如果我按照某人的建議消除了這個消息,例如使用ifstream infile = ifstream(fileName);而不是,當傳遞給board時,我是否必須做任何事情(比如使它成爲指針)?由於電路板接受'ifstream&file'。或者我必須更換電路板? – user5759490

+0

另外,感謝您的鏈接。好東西,我可以讀俄羅斯大聲笑 – user5759490

+0

*「你先定義它,然後,你不使用它,因爲你創建一個新的變量,這個名字隱藏在主要infile。」*未使用的變量是一個在'if(!flag)'行中定義。你後來解釋正確,但我所引用的陳述讓它回到前面。 – juanchopanza

0

,因爲萬一if條件計算爲false你得到警告,變量將不被聲明,因此將是未使用。你已經宣佈它,所以省略ifstream並將其更改爲infile = new ifstream(filename);

1

讓我們來看看這個特定的代碼塊

if (!flag) { 
    ifstream *infile = new ifstream("defaultMap.txt"); 
} 

這裏定義只有用大括號範圍infile。如果您嘗試在花括號之外使用它,它將不可見。就你而言,當你在本節之後使用infile時,你實際上使用了在頂部聲明的同名變量。因此,有效地,在此塊中定義的infile不被使用,因此不會發出警告。

相關問題