肯定使用我的变量时未使用的变量错误

时间:2016-04-03 07:26:46

标签: c++ file file-io filestream

如果没有提供文件名,我想使用默认值。或者,如果提供了文件名但无法访问该文件,请使用默认值。

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);

的董事会

3 个答案:

答案 0 :(得分:2)

您正在使用相同名称隐藏上一个变量。

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

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

请参阅?您首先在上面定义了它,然后,您不会在if语句中使用它,因为您创建了一个名为隐藏 infile在主要顶部的新变量。因此,if语句中的infile使其生命周期在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

此外:

  • 考虑将"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

  • 考虑只是为了审核您自己的代码,您需要在此处进行大量重构,这将极大地简化您的代码并使人们更容易阅读和理解。

答案 1 :(得分:1)

让我们看看这段特殊的代码

if (!flag) {
    ifstream *infile = new ifstream("defaultMap.txt");
}
此处定义的

infile只有花括号的范围。如果你试图在花括号之外使用它,它就不会被看见。在您的情况下,当您在本节后使用infile时,您实际上使用在顶部声明的同名变量。如此有效,此块中定义的infile未被使用,因此警告。

答案 2 :(得分:0)

您收到警告,因为如果if条件评估为false,则不会声明该变量,因此未使用。您已经声明了它,因此请省略ifstream并将其更改为infile = new ifstream(filename);