C++ 在C+;中的if-else块中声明变量+;
我试图在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
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
}
}