[C++] 248 SDL : コンストラクタの初期化リスト ChatGPT

[M1 Mac, Monterey 12.6.3, clang 13.0.0, SDL 2.26.2, ChatGPT Plus, NO IDE]

コンストラクタの初期化リストについてあまりよく分かっていなかったので、ChatGPTに説明してもらいました。

大分理解が深まったように思います。

Q1: SDLアプリの以下のコードを解説してください。
Game::Game() : m_deltaTimeSeconds( 0.0f ) ,
m_framesUntilFall( s_initialFramesPerFallStep ) ,
m_framesPerFallStep( s_initialFramesPerFallStep ) , m_numUserDropsForThisTetronimo( 0 ) ,
m_numLinesCleared( 0 ) ,
m_level( 0 ) ,
m_score( 0 ) ,
m_hiScore( 0 ) ,
m_gameState( kGameState_TitleScreen )
{ m_field.staticBlocks = nullptr; }

このコードは、SDLを使用して作成されたゲームのコンストラクタであり、以下のように各メンバー変数を初期化しています。

  • m_deltaTimeSeconds:前のフレームからの時間差を表す変数を0.0fで初期化しています。
  • m_framesUntilFall:新しいテトロミノが落下するまでのフレーム数を表す変数であり、s_initialFramesPerFallStep(定数)で初期化しています。
  • m_framesPerFallStep:テトロミノが1段落下するのに必要なフレーム数を表す変数であり、s_initialFramesPerFallStepで初期化しています。
  • m_numUserDropsForThisTetronimo:ユーザーがテトロミノを操作した際に、落下させた回数を表す変数であり、0で初期化しています。
  • m_numLinesCleared:ゲームでクリアしたラインの数を表す変数であり、0で初期化しています。
  • m_level:ゲームのレベルを表す変数であり、0で初期化しています。
  • m_score:ゲームのスコアを表す変数であり、0で初期化しています。
  • m_hiScore:過去に達成した最高スコアを表す変数であり、0で初期化しています。
  • m_gameState:ゲームの状態を表す変数であり、kGameState_TitleScreenで初期化しています。

また、m_field.staticBlocksnullptrで初期化しています。m_fieldは、ゲームフィールドを表す構造体であり、staticBlocksは静的なブロックの配列を指すポインタです。初期化することで、メモリが確保されていないことを表しています。後で動的に確保する予定があると思われます。

Q2: 以下のコンストラクタでも問題ないですか?
Game::Game() {
m_deltaTimeSeconds = 0.0f;
m_framesUntilFall = s_initialFramesPerFallStep;
m_framesPerFallStep = s_initialFramesPerFallStep; m_numUserDropsForThisTetronimo = 0;
m_numLinesCleared = 0;
m_level = 0;
m_score = 0;
m_hiScore = 0;
m_gameState = kGameState_TitleScreen;
m_field.staticBlocks = nullptr; }

はい、このコードでも問題ありません。このコードは、先に解説したコードと同様に、各メンバー変数を初期化しています。:での初期化リストの代わりに、コンストラクタの本文で各メンバー変数を初期化しています。{}で囲む必要はなく、必要最低限のコードになっているため、より簡潔になっています。ただし、先に解説したコードよりも少し冗長であると言えます。

Q3: 以下のコンストラクタでも問題ないですか?
Game::Game() : m_deltaTimeSeconds( 0.0f ) ,
m_framesUntilFall( s_initialFramesPerFallStep ) ,
m_framesPerFallStep( s_initialFramesPerFallStep ) , m_numUserDropsForThisTetronimo( 0 ) ,
m_numLinesCleared( 0 ) ,
m_level( 0 ) ,
m_score( 0 ) ,
m_hiScore( 0 ) ,
m_gameState( kGameState_TitleScreen ) ,
m_field.staticBlocks(nullptr)
{}

はい、このコードは正しい構文です。初期化リストを使用して各メンバー変数を初期化しており、最後の要素であるm_field.staticBlocksnullptrで初期化しています。また、コンストラクタの本体には、ブロックの終了を示すための{}が含まれています。したがって、このコードは問題ありません。

Q3への回答ではChatGPTは正しいとしていますが、実際はm_field.staticBlocks(nullptr)といった書き方ではエラーになります。メンバ変数のプロパティはこのようには初期化できません。{ m_field.staticBlocks = nullptr; }が正しい表現です。