не понимаю ошибку в switch

Здраствуйте! Перехожу с C# на C++ и столкнулся с проблемой:

#include <iostream>

char chooseSimbol() {
    char s;
    std::cout << "\n\n\tВыберите символ, которым будет рисоваться линия: ";
    std::cin >> s;
    system("cls");
    return s;
    }

int chooseLineLength() {
    int lineLength;
    std::cout << "\n\n\tВведите длину линию: ";
    std::cin >> lineLength;
    system("cls");
    return lineLength;
}

int main()
{ 
    setlocale(LC_ALL, "ru");
    std::cout << "\n\n\n\t\t\t\t\tРисовальщик линии \n\n\n";
    std::cout << "\n\tКакую линию вы будете рисовать?"
        << "\n\t[1] - Горизонтальную"
        << "\n\t[2] - Вертикальную"
        << "\n\n\t\t> ";

    int menuA;
    std::cin >> menuA;
    system("cls");

    switch (menuA)
    {
        case 1:
            char s = chooseSimbol();
            int a = chooseLineLength();
            for (int i = 0; i < a; i++) {
                std::cout << s;
            }
        break;

        case 2:
            char s = chooseSimbol();
            int a = chooseLineLength();
            for (int i = 0; i < a; i++) {
                std::cout << s << "\n";
            }
        break;

    }
}

Данный код выдаёт ошибки:

  • a: переопределение; множественная инициализация
  • s: переопределение; множественная инициализация
  • пропуск инициализации "a" из-за метки "case"
  • пропуск инициализации "s" из-за метки "case"

Однако, если заменить Switch() на обычные операторы ветвления, то всё работает именно так, как мне нужно в данном примере:

if (menuA == 1) {
    char s = chooseSimbol();
    int a = chooseLineLength();
    for (int i = 0; i < a; i++) {
        std::cout << s;
    }
}
else {
    char s = chooseSimbol();
    int a = chooseLineLength();
    for (int i = 0; i < a; i++) {
        std::cout << s << "\n";
    }
}

Первые две ошибки я вроде бы исправил, сделав индивидуальный идентификатор каждой переменной, но не понимаю почему дебаг ругается на это, разве case 1 и case 2 - это не две разные области видимости?

Вторые две ошибки я никак не могу решить.


Ответы (1 шт):

Автор решения: Harry

Само по себе case не определяет область видимости, так что ваши объявления переменных оказались в одном блоке. Грубо, как если бы вы наприали

int x = 1;
int x = 2;

Просто поместите код каждого case в фигурные скобки:

case 1:
    {
        char s = chooseSimbol();
        int a = chooseLineLength();
        for (int i = 0; i < a; i++) {
            std::cout << s;
        }
    }
    break;

case 2:
    {
        char s = chooseSimbol();
        int a = chooseLineLength();
        for (int i = 0; i < a; i++) {
            std::cout << s << "\n";
        }
    }
    break;

Тем самым вы ограничиваете области видимости до нужного уровня :)

→ Ссылка