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

时间:2009-11-24 23:57:00

标签: 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
}

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

  

driver.cpp:38:错误:未使用的变量   'player'
driver.cpp:40:错误:   未使用的变量'播放器'
  driver.cpp:42:错误:未使用的变量   'player'
driver.cpp:45:错误:   “玩家”未在此声明   范围

有什么想法吗?

6 个答案:

答案 0 :(得分:20)

你的问题是玩家在每个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;

}

答案 1 :(得分:16)

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

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

答案 2 :(得分:3)

如果在范围内放置一个静态变量(由{ }分隔),则当范围结束时该变量将不再可用。

请改为尝试:

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

    // TODO: validate argc and argv here
    if (argc < 3) {
        printf("error: not enough arguments\n");
        exit(1);
    }

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

    if (!player_ptr) {
        printf("error: invalid argument %s\n", argv[3]);
        exit(1);
    }

    Player& player = *player_ptr;

    // More code
}

答案 3 :(得分:2)

您已在三个不同的范围内声明了三个单独的player变量,错误消息正是说明了它的含义。

您需要在if - 语句之外声明单个播放器变量并分配结果。这很棘手,因为玩家是一个参考 - 你必须初始化一次。

您可以将if - 语句放在一个函数(比如GetPlayer())中,该函数返回一个指向该对象的指针,然后使用* GetPlayer()初始化播放器。

答案 4 :(得分:0)

if (argv[3] == string("simple")) {
    Player & player = *get_Simple();
} 

变量仅存在于{}之间。当你到达}时,该变量尚未使用,将被丢弃,从未使用过。

答案 5 :(得分:0)

#include <map>

int main(int argc, char **argv)
{
    typedef std::map<std::string, Player*(*)()> lookup;
    lookup mapping;

    mapping["simple"] = get_Simple;
    mapping["counting"] = get_Counting;
    mapping["competitor"] = get_Competitor;

    lookup::const_iterator it = mapping.find(argv[3]);
    if (it == mapping.end())
    {
        std::cout << "illegal argument\n";
    }
    else
    {
        Player& player = *it->second();
        // more code
    }
}