Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+;中的if-else块中声明变量+;_C++_Variables_If Statement - Fatal编程技术网

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

C++ 在C+;中的if-else块中声明变量+;,c++,variables,if-statement,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(); } els

我试图在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:错误:未使用的变量 “播放器”驱动程序。cpp:40:错误: 未使用的变量“player”
driver.cpp:42:错误:未使用的变量 “播放器”驱动程序。cpp:45:错误: “玩家”未在此列表中声明 范围


有什么想法吗?

如果您将一个静态变量放在一个范围内,由
{}
分隔,那么当范围结束时,该变量将不再可用

请尝试以下方法:

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
}
intmain(intargc,char*argv[]){
//TODO:在此处验证argc和argv
如果(argc<3){
printf(“错误:参数不足\n”);
出口(1);
}
Player*Player_ptr=NULL;
if(argv[3]==字符串(“简单”)){
player_ptr=get_Simple();
}else if(argv[3]==字符串(“计数”)){
player_ptr=get_Counting();
}else if(argv[3]==字符串(“竞争对手”)){
player_ptr=get_Competitor();
}
如果(!player_ptr){
printf(“错误:无效参数%s\n”,argv[3]);
出口(1);
}
Player&Player=*Player\u ptr;
//更多代码
}
中的


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

您的问题是播放器在每个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;

}

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

您需要在
if
-语句之外声明一个播放器变量并分配结果。这很棘手,因为player是一个引用——您必须初始化它一次


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

其他人建议使用指针。但是,也可以使用条件运算符

Player & player = argv[3] == string("simple") ? get_Simple()
                : argv[3] == string("counting") ? get_Counting() 
                : get_Competitor(); 
#包括
int main(int argc,字符**argv)
{
typedef std::映射查找;
查找映射;
映射[“简单”]=get_simple;
映射[“计数”]=获取_计数;
映射[“竞争对手”]=获取竞争对手;
lookup::const_迭代器it=mapping.find(argv[3]);
if(it==mapping.end())
{
std::cout second();
//更多代码
}
}

引用必须有初始值。是的,我搞砸了。试图修复它。您还需要将指针设为NULL,否则断言可能会完全关闭,因为它可能会跳过所有子句。本着同样的精神,由于指针可以保持为空,引用可能是一个问题。当然,您不应该使用断言来验证用户输入。此建议是合理的,但是我建议您可以通过使用一个工厂方法来避免最后的整个指针/引用开关,该方法接受您的类型参数并返回一个
Player*
。因此,您的主要方法变成
Player&Player=*getPlayerByType(argv[3])
getPlayerByType()
中的
if
语句都直接返回,从而避免了所有局部变量的丑陋。@bradheintz:这个建议一点帮助都没有(事实上,它通过提供虚假的建议而使答案变得混乱)。很明显,OP实际上是在尝试完全按照您所说的做(并返回一个引用(而不是解决方案中的指针))。但是在这里发布了这个问题最简单的可编译版本。如果你想发布一个答案,那么我们至少可以给你一个否定的分数,因为你没有回答这个问题。我不确定将对象创建打包到一个单一的责任函数中,消除一个不必要的局部变量,并生成main()函数更容易被扫描——但如果你更乐意将我的建议称为“虚假”,或者将Brian R.Bondy的好建议的改进称为“杂乱”,而不支持断言,那就去做吧。
Player & player = argv[3] == string("simple") ? get_Simple()
                : argv[3] == string("counting") ? get_Counting() 
                : get_Competitor(); 
#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
    }
}