C++でのgotoステートメントの使用について質問があります。私は、このトピックが物議を醸していることを理解しており、抜本的なアドバイスや議論には興味がありません(私は通常、を使用することから外れていgoto
ます)。むしろ、私には特定の状況があり、gotoステートメントを使用する私のソリューションが良いものであるかどうかを理解したいと思います。私は自分自身をC++の初心者とは呼びませんが、自分自身をプロレベルのプログラマーとして分類することもしません。私の質問を生成したコードの部分は、開始されると無限ループで回転します。擬似コードでのスレッドの一般的なフローは次のとおりです。
void ControlLoop::main_loop()
{
InitializeAndCheckHardware(pHardware) //pHardware is a pointer given from outside
//The main loop
while (m_bIsRunning)
{
simulated_time += time_increment; //this will probably be += 0.001 seconds
ReadSensorData();
if (data_is_bad) {
m_bIsRunning = false;
goto loop_end;
}
ApplyFilterToData();
ComputeControllerOutput();
SendOutputToHardware();
ProcessPendingEvents();
while ( GetWallClockTime() < simulated_time ) {}
if ( end_condition_is_satisified ) m_bIsRunning = false;
}
loop_end:
DeInitializeHardware(pHardware);
}
pHardwareポインターは、ControlLoopオブジェクトの外部から渡され、ポリモーフィック型であるため、RAIIを使用して、main_loop内でハードウェアインターフェイス自体を作成および破棄することはあまり意味がありません。pHardwareに、main_loopの終了時に自動的にクリーンアップできるハードウェアの一種の「セッション」または「使用」を表す一時オブジェクトを作成させることができると思いますが、そのアイデアが誰かにそれをより明確にするかどうかはわかりませんそうでなければ私の意図は何ですか。ループから抜け出す方法は3つしかありません。1つは、外部ハードウェアから不正なデータが読み取られた場合です。2つ目は、ProcessPendingEvents()がユーザーによる中止を示している場合です。これにより、m_bIsRunningがfalseになります。最後は、ループの最下部で終了条件が満たされた場合です。m_bIsRunning = false
その後。
また、ここでbreakキーワードを使用できることも理解していますが、main_loop内のこれらの擬似コード関数呼び出しのほとんどは、多くの引数が必要であるか、すべてがメンバー変数にアクセスする必要があるため、実際には関数としてカプセル化されていません。私の意見では、これらのケースはどちらも、単にmain_loopを長い関数として残すよりも混乱を招きます。また、大きなwhileループの長さのために、のようなステートメントはgoto loop_end
私にはより明確に読めるようです。
さて、質問です。このソリューションを独自のコードで記述した場合、このソリューションは不快になりますか?私には少し違和感がありますが、C ++コードでこれまでgotoステートメントを使用したことはありません。したがって、専門家に助けを求めています。このコードをより明確にするために私が見逃している他の基本的なアイデアはありますか?
ありがとう。