C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
внутри оператора switch нельзя создавть обьекты ?
juice
Отправлено: 23.02.2005, 12:47


Дежурный стрелочник

Группа: Участник
Сообщений: 33



почему внутри оператора switch нельзя создавть обьекты, например потоки?
Делаю так:
CODE

switch (QueryThread->thrdresult)
  {
  case 0 :
 ...
  case 1 :
       tmrProcess->Enabled = false;
       tmrProcess1->Enabled = true;
       pbProcess->Position = 100;

       TQueryThread *QueryThread2 = new TQueryThread(true);
       QueryThread = QueryThread2;
       QueryThread->thrdtask = 2;
       QueryThread->OnTerminate = QueryTerminate;
       QueryThread->FreeOnTerminate = true;
       QueryThread->Resume();
       break;
  case 2 :  // вот тут ошибка

[C++ Error] fm_main.cpp(47): E2126 Case bypasses initialization of a local variable
Георгий
Отправлено: 23.02.2005, 15:29


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



необходимо объявить логический блок (не помню как он по стандарту называется). т.е. обрамить тело case 1: в фигурные скобки:
CODE
switch(..)
{case 1:
{
...};
break;
case 2:
{...};
break;
};

а уже внутри фигурных, могут быть свои локальные переменные
juice
Отправлено: 23.02.2005, 16:39


Дежурный стрелочник

Группа: Участник
Сообщений: 33



Спасибо, работает. Интересно в чем тут смысл
Treumer
Отправлено: 24.02.2005, 12:18


Станционный диспетчер

Группа: Участник
Сообщений: 92



QUOTE (juice @ 23/02/2005, 16:39)
Спасибо, работает. Интересно в чем тут смысл

Смысл ясен: компилятор, если
TQueryThread *QueryThread2 не описана в фигруных скобках, считает
переменной видимой во всей функции, а при попадении на case 2 она компилятором не будет создана, хотя и должна быть "видима" в этом участке кода. Когад все в скобках — "видимость" переменной ими и определяется.

А вообще, кажется мне, что если сделать так:
CODE

case 1 :
      tmrProcess->Enabled = false;
      tmrProcess1->Enabled = true;
      pbProcess->Position = 100;

      QueryThread = new TQueryThread(true);
      QueryThread->thrdtask = 2;
      QueryThread->OnTerminate = QueryTerminate;
      QueryThread->FreeOnTerminate = true;
      QueryThread->Resume();
      break;


То и никаких доп. скобок бы не понадобилось.
Deem
Отправлено: 25.02.2005, 13:52


Мастер участка

Группа: Участник
Сообщений: 327



Между оператором goto и меткой нельзя описывать переменные. Правда, со скобками не пробовал. smile.gif По той же причине: не гарантированно создание переменной, к которой могут обратиься другие. Я описываю в начале функции, и все.

Отредактировано Deem — 25/02/2005, 13:55

Вернуться в Вопросы программирования в C++Builder