-4

我的代码遇到了问题,请参阅以下代码片段:

bool flag = false;

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

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

在这种情况下 var 被标记为 undefined 并且 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

有什么想法可以解决问题或欺骗编译器吗?

4

2 回答 2

2

您可以使用动态分配来完成条件构造:

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

if (Streamer) Streamer->something();

请记住,由于对象是有条件地构造的,因此它只存在该分支被采用的内容。所以你需要在使用前附加条件(或者在else分支上构建它)。

另一种方法是boost::optional. 它不需要动态分配。您也可以使用缓冲区和新位置滚动您自己的。小心对齐。

于 2015-02-27T15:25:30.130 回答
1

这个片段应该更好地工作:

bool flag = false;
int  var  = 0;

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

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

在您的代码片段中,var声明在if范围内(在其关联的 之间{})。当到达第一个时它被摧毁}。如果你想让它在第一个 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;
  }

小心点,streamerPtrRtspSessionPtr他们的一生都绑定到_dummyCStreamerand_dummyCRtspSession的。(分别)当然,您的类必须实现适当的 operator=。

于 2015-02-27T15:28:51.810 回答