在C++中声明if-else块中的变量

blc*_*llo 6 c++ variables if-statement

我试图在if-else块中声明一个变量,如下所示:

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

    if (argv[3] == string("simple")) {
        Player & player = *get_Simple();
    } else if (argv[3] == string("counting")) {
        Player & player = *get_Counting();
    } else if (argv[3] == string("competitor")) {
        Player & player = *get_Competitor();
    }

    // More code
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试编译时,我遇到以下错误:

driver.cpp:38:错误:未使用的变量'
player'driver.cpp:40:错误:未使用的变量'
player'driver.cpp:42:错误:未使用的变量'
player'driver.cpp:45:错误:'player'在这方面没有申明

有任何想法吗?

Bri*_*ndy 21

你的问题是玩家在每个if/else if块中超出范围.

您需要在所有if语句之上声明变量.

但是你不能使用引用,因为你必须立即初始化引用.

相反,你可能想要这样的东西:

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

    Player * pPlayer = NULL;
    if (argv[3] == string("simple")) {
        pPlayer = get_Simple();
    } else if (argv[3] == string("counting")) {
        pPlayer = get_Counting();
    } else if (argv[3] == string("competitor")) {
        pPlayer = get_Competitor();
    }

    //Then if you really want to...
    Player &player = *pPlayer;

}
Run Code Online (Sandbox Code Playgroud)

  • 这个建议是合理的,但是我建议你可以通过一个带有你的类型参数并返回`Player*`的工厂方法来避免整个指针/引用switchheroo.所以你的main方法变成`Player&player =*getPlayerByType(argv [3]);`,`getPlayerByType()`中的`if`语句都直接返回,从而避免了所有的局部变量丑陋. (4认同)
  • @bradheintz:这个建议丝毫没有帮助(事实上它通过提供虚假的建议使得答案变得混乱).很明显,OP实际上正在尝试完全按照你所说的去做(并返回一个引用(而不是你的解决方案中的指针)).但是在这里发布了问题的简单可编辑版本.如果你想发一个答案,那么我们至少可以给你一个负面的标记,不回答这个问题. (2认同)

rlb*_*ond 17

其他人提出了建议.但是,也可以使用条件运算符.

Player & player = argv[3] == string("simple") ? get_Simple()
                : argv[3] == string("counting") ? get_Counting() 
                : get_Competitor(); 
Run Code Online (Sandbox Code Playgroud)