簡體   English   中英

絕對使用我的變量時出現未使用的變量錯誤

[英]Unused variable error when my variable is definitely being used

如果沒有提供文件名,我想使用默認值。 或者,如果提供了文件名但無法訪問該文件,請使用默認值。

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);Board * grid = new Board(*infile, playerRace, flag);

您正在使用相同的名稱隱藏先前的變量。

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

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

看到? 您首先在上面定義了它,然后在if語句中不使用它,因為您使用此名稱創建了一個新變量,該變量 infile 隱藏在main頂部。 因此,if語句中的infile的生存期在if (!flag)范圍的末尾到期,因此它將不再存在,並且您的infile變量將從頂部再次可見:

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

要使用先前的變量,只需不使用新變量的聲明將其隱藏即可,只需使用previous即可:

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

也:

  • 考慮將"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

  • 考慮只查看您自己的代碼,您需要在此處進行大量的重構,這將大大簡化您的代碼並使人們更容易閱讀和理解。

讓我們看一下這段代碼

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

此處定義的infile僅具有大括號的范圍。 如果嘗試在花括號之外使用它,則將不可見。 就您而言,當您在本節之后使用infile時,實際上您使用的是在頂部聲明的同名變量。 如此有效,不使用此塊中定義的infile ,因此發出警告。

之所以收到警告,是因為if條件的計算結果為false ,則該變量將不會被聲明,因此將不被使用 您已經聲明了它,因此省略ifstream並將其更改為infile = new ifstream(filename);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM