简单代码问题 - 未定义的标识符
Simple Code issue - undefined identifier
我的代码遇到问题,请参阅以下代码片段:
bool flag = false;
if(flag==false)
{
int var=0;
flag=true;
}
if(flag==true)
{
var=10;
}
在这种情况下,var 被标记为未定义,CCS 生成错误,这是完全正确的。只要在 if 情况下定义了变量,外部就不知道。当然,您可以在这种情况下重写代码。但是在我的实际代码中,我必须使用非默认构造函数从 class 构建一个对象,并且除了使用 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
有什么办法可以解决问题或欺骗编译器吗?
可以使用动态分配来完成条件构造:
std::unique_ptr<CStreamer> Streamer;
if (...) {
Streamer = make_unique<CStreamer>(ClientSocket);
}
if (Streamer) Streamer->something();
请记住,由于该对象是有条件地构建的,因此它只存在该分支所采用的内容。所以你需要在使用前附加条件(或者也在 else
分支上构造它)。
另一种方法是boost::optional
。它不需要动态分配。您还可以使用新的缓冲区和放置来滚动自己的。注意对齐。
这段代码应该效果更好:
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;
}
小心,streamerPtr
和 RtspSessionPtr
的生命周期与 _dummyCStreamer
和 _dummyCRtspSession
的生命周期绑定。 (分别)
当然,您的 类 必须实施适当的 operator=.
我的代码遇到问题,请参阅以下代码片段:
bool flag = false;
if(flag==false)
{
int var=0;
flag=true;
}
if(flag==true)
{
var=10;
}
在这种情况下,var 被标记为未定义,CCS 生成错误,这是完全正确的。只要在 if 情况下定义了变量,外部就不知道。当然,您可以在这种情况下重写代码。但是在我的实际代码中,我必须使用非默认构造函数从 class 构建一个对象,并且除了使用 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
有什么办法可以解决问题或欺骗编译器吗?
可以使用动态分配来完成条件构造:
std::unique_ptr<CStreamer> Streamer;
if (...) {
Streamer = make_unique<CStreamer>(ClientSocket);
}
if (Streamer) Streamer->something();
请记住,由于该对象是有条件地构建的,因此它只存在该分支所采用的内容。所以你需要在使用前附加条件(或者也在 else
分支上构造它)。
另一种方法是boost::optional
。它不需要动态分配。您还可以使用新的缓冲区和放置来滚动自己的。注意对齐。
这段代码应该效果更好:
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;
}
小心,streamerPtr
和 RtspSessionPtr
的生命周期与 _dummyCStreamer
和 _dummyCRtspSession
的生命周期绑定。 (分别)
当然,您的 类 必须实施适当的 operator=.