Область видимости в c++
Имеется отрезок кода:
int main (int argc, char* argv[])
{
if ( argc == 2 )
{
Alpha x(argv[1]);
}
if ( argc == 3 )
{
Alpha x(argv[1], argv[2]);
}
if ( argc != 2 && argc != 3 )
{
cout << "Arguments error" << endl;
return 1;
}
cout << x << endl;
return 0;
}
который при попытке компиляции выдает ошибку:
user@user:~$ g++ lab4.cpp
lab4.cpp:100:18: error: ‘x’ was not declared in this scope
100 | cout << x << endl;
| ^
Значит ли это, что x находится вне области видимости, и как лучше поступить в данной ситуации, не переписывая вывод в каждую отдельную проверку количества аргументов?
Ответы (3 шт):
Автор решения: user7860670
→ Ссылка
Область видимости x ограничена фигурными скобками. В данной ситуации лучше вынести создание в отдельную функцию. Заодно потом можно будет написать для этого кода тесты.
inline Alpha Make_Alpha(int const argc, char * * const pp_args)
{
if ( 2 == argc )
{
return Alpha{pp_args[1]};
}
if ( 3 == argc )
{
return Alpha{pp_args[1], pp_args[2]};
}
throw ::std::runtime_error{"Arguments error"};
}
int main (int const argc, char * * const pp_args)
{
auto x{Make_Alpha(argc)};
cout << x << endl;
return 0;
}
Автор решения: Harry
→ Ссылка
int main (int argc, char* argv[]) // Здесь x нет
{ // Здесь x нет
if ( argc == 2 ) // Здесь x нет
{ // Здесь x нет
Alpha x(argv[1]); // Здесь есть тот x, который argv[1]
} // Здесь этот x приказал долго жить...
if ( argc == 3 ) // Здесь x нет
{ // Здесь x нет
Alpha x(argv[1], argv[2]); // Здесь есть тот x, который argv[1],argv[2]
} // Здесь этот x приказал долго жить...
if ( argc != 2 && argc != 3 ) // Здесь x нет
{ // Здесь x нет
cout << "Arguments error" << endl;
return 1; // Здесь x нет
} // Здесь x нет
cout << x << endl; // Здесь x нет
Но допустим на минутку, что в последней строчке x есть. Вы - компилятор. Ответьте, какой именно x выводить? Первый или второй?
Автор решения: anton
→ Ссылка
int main(int argc, char** argv)
{
Alpha* y = nullptr;
switch (argc)
{
case 2:
y = new Alpha(argv[1]);
break;
case 3:
y = new Alpha(argv[1], argv[2]);
break;
default:
std::cerr << "Arguments error\n";
return 1;
}
{
Alpha& x = *y;
// ...
std::cout << x << "\n";
}
delete y;
return 0;
}