[英]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_ptr或unique_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.