Простая проблема с кодом - неопределенный идентификатор

Я столкнулся с проблемой с моим кодом, см. Следующий фрагмент кода:

bool flag = false;

if(flag==false)
{ 
int var=0;
flag=true;
}

if(flag==true)
{
var=10;
}

В этом случае var помечается как неопределенный, и CCS генерирует ошибку, которая совершенно правильна. Пока переменная определена в случае if, она не известна извне. Конечно, вы можете переписать код в этом случае. Но в моем собственном коде я построил объект из класса с конструктором не по умолчанию, и это не может быть решено иначе, чем с помощью if (по крайней мере, я понятия не имею, как)

Мой фактический код:

SelectedSocket2=VCRT_selectset(&MasterSocket,1,-1); 

if((SelectedSocket != VCRT_SOCKET_ERROR) && (SelectedSocket != 0))
{
ClientSocket=accept(MasterSocket, NULL, NULL);
CStreamer    Streamer(ClientSocket);                  
CRtspSession RtspSession(ClientSocket,&Streamer);          
flag=true;
}
//Streamer, RtspSession are outside unknown and CCS generates an error

Любые идеи, как я могу решить проблему или обмануть компилятор?

2 ответа

Решение

Этот фрагмент должен работать лучше:

bool flag = false;
int  var  = 0;

if (flag == false)
{ 
    var = 0;
    flag = true;
}

if (flag == true)
{
    var = 10;
}

В вашем фрагменте кода, var объявлен в рамках if область (между {}). Разрушается, когда первый } достигнуто Если вы хотите, чтобы он остался в живых после первого, если вы должны объявить об этом снаружи.

РЕДАКТИРОВАТЬ:

С указателем без динамического выделения (используя char[] для поддельного выделения):

  // Allocate the needed size for CStreamer (Statically
  char _dummyCStreamer[sizeof(CStreamer)];
  // Same for CRtspSession
  char _dummyCRtspSession[sizeof(CRtspSession)];
  SelectedSocket2 = VCRT_selectset(&MasterSocket, 1, -1);

  // The following two lines are the trick
  CStreamer *streamerPtr = (CStreamer *)_dummyCStreamer;
  CRtspSession *RtspSessionPtr = (CRtspSession *)_dummyCRtspSession;

  // Go ahead, you can now consider your two pointer as if they were statically allowed
  if ((SelectedSocket != VCRT_SOCKET_ERROR) && (SelectedSocket != 0))
  {
    ClientSocket = accept(MasterSocket, NULL, NULL);
    CStreamer    Streamer(ClientSocket);
    CRtspSession RtspSession(ClientSocket, &Streamer);
    streamerPtr->operator=(Streamer);
    sessionPtr->operator=(RtspSession);
    flag = true;
  }

Быть осторожен, streamerPtr а также RtspSessionPtr их жизнь связана с _dummyCStreamerа также _dummyCRtspSessionх. (Соответственно) Конечно, ваши классы должны реализовать правильный оператор =.

Вы можете использовать динамическое размещение для выполнения условного конструирования:

std::unique_ptr<CStreamer> Streamer;
if (...) {
    Streamer = make_unique<CStreamer>(ClientSocket);
}

if (Streamer) Streamer->something();

Помните, что, поскольку объект был условно построен, существует только то, что было взято этой ветвью. Таким образом, вам нужно дополнительное условие перед использованием (или построить его также на else ветка).

Другой подход boost::optional, Это не нуждается в динамическом распределении. Вы также можете свернуть свои собственные с буфером и новые места размещения. Будьте осторожны с выравниванием.

Другие вопросы по тегам