-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;
  }

注意streamerPtrして、それらのライフタイムをとのものRtspSessionPtrにバインドしてください。(それぞれ) もちろん、クラスは適切な operator= を実装する必要があります。_dummyCStreamer_dummyCRtspSession

于 2015-02-27T15:28:51.810 に答える