регистр переключения классов с ++ - PullRequest
1 голос
/ 18 февраля 2012
    switch(choice)
    {
        case 1:
            uinstance1.addNewProduct(data);
            break;
        case 2:
            break;
        case 3:
            break;
        case 4:
            break;
        case 5:
            break;
        case 6:
            break;
        case 7:
            uinstance1.listAllProducts(data);
            break;
        case 8:
            break;
        case 9:
            break;
        case 10:

            //name,category,barcode,price,manufacturer,noinstock,soldpermonth,expirydate,discount
            //  Perishable(string,string,string,double,string,int,int);
            Perishable item0("Ferrari","Automobile","9999",2999.99,"Popular",5,0);

            data.addNew(item0);

            break;
        default:
            cout<<"Wrong Choice "<<endl;
            system("pause");
            break;
    }
}

Привет, я долго думал об этой ошибке и, похоже, не могу решить проблему.

Ошибка C2361: инициализация 'item0' пропускается по метке 'default':см. объявление 'item0'

Была бы признательна за помощь.Спасибо

Ответы [ 5 ]

7 голосов
/ 18 февраля 2012

Весь блок выбора считается одной областью, если вы декаляризируете переменную в этой области, вам нужно инициализировать ее в каждом операторе case (каждый возможный путь выполнения). Вы можете избежать этого, создав дополнительную область в вашем случае, чтобы избежать проблемы (см. Скобки):

switch(choice)
    {
        case 1:
            uinstance1.addNewProduct(data);
            break;
        case 2:
            break;
        case 3:
            break;
        case 4:
            break;
        case 5:
            break;
        case 6:
            break;
        case 7:
            uinstance1.listAllProducts(data);
            break;
        case 8:
            break;
        case 9:
            break;
        case 10:
            {
                //name,category,barcode,price,manufacturer,noinstock,soldpermonth,expirydate,discount
                //  Perishable(string,string,string,double,string,int,int);
                Perishable item0("Ferrari","Automobile","9999",2999.99,"Popular",5,0);

                data.addNew(item0);
            }
            break;
        default:
            cout<<"Wrong Choice "<<endl;
            system("pause");
            break;
    }
}
3 голосов
/ 18 февраля 2012

MSDN объясняет ошибку C2361 :

Инициализация идентификатора может быть пропущена в операторе switch. Вы не можете перепрыгнуть через объявление с инициализатором, если объявление не заключено в блок. (Если это не объявлено в блоке, переменная находится в области видимости до конца оператора switch.)

Всегда обращайте внимание на номера ошибок, которые они предоставляют важную информацию о причинах ошибки.

Вы забыли скобки в одном из случаев.

   case 10:
    {  
   ^^^
       Perishable item0;
       data.addNew(item0);

       break;
    }  
   ^^^ 
1 голос
/ 18 февраля 2012

Вы не можете создавать переменные внутри операторов case, если не определяете область видимости.

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

1 голос
/ 18 февраля 2012

Ваш ярлык пересекает инициализацию, которая является недопустимой. Уверен, перемещение default наверх должно исправить это. Вы также можете добавить блоки кода { } вокруг вашего соответствующего кода. Если у вас все еще есть проблемы, переместите ваш объект за пределы блока переключателей.

0 голосов
/ 18 февраля 2012
case 10:
{ // <<-- This gives explicit scope for the stack variable and let's you get rid of the error
  Perishable item0;
  // ...
}
break;
...