main()
のイベントループをクラスに分離して、例えば MainWindow
クラスで制御する形にするのは、OOP的に正しく、拡張しやすい構成です。
以下に、main()
は最小にして、MainWindow
クラスでイベントループや処理を担当する構造を示します。
✅ main()
を MainWindow
クラスに分離した例
/* g++ sdl_class.cpp -o sdl_class -lSDL2 */ #include <SDL2/SDL.h> #include <iostream> class Window { public: Window(const char* title, int x, int y, int w, int h, Uint32 flags) : window_(nullptr), isInitialized_(false) { if (SDL_Init(SDL_INIT_VIDEO) < 0) { std::cerr << "SDL could not initialize! SDL_Error: " << SDL_GetError() << std::endl; return; } window_ = SDL_CreateWindow(title, x, y, w, h, flags); if (window_ == nullptr) { std::cerr << "Window could not be created! SDL_Error: " << SDL_GetError() << std::endl; SDL_Quit(); return; } isInitialized_ = true; } ~Window() { if (window_ != nullptr) { SDL_DestroyWindow(window_); } SDL_Quit(); } bool isInitialized() const { return isInitialized_; } SDL_Window* getSDLWindow() const { return window_; } private: SDL_Window* window_; bool isInitialized_; }; class MainWindow { public: MainWindow() : window_("SDL2 Class Window", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, SDL_WINDOW_SHOWN), running_(false) {} void run() { if (!window_.isInitialized()) { return; } running_ = true; SDL_Event e; while (running_) { while (SDL_PollEvent(&e)) { if (e.type == SDL_QUIT) { running_ = false; } } // 描画や更新処理を追加する場合はここに SDL_Delay(16); // 約60fps相当のウェイト } } private: Window window_; bool running_; }; int main(int argc, char* argv[]) { MainWindow app; app.run(); return 0; }
✅ この構成の利点
ポイント | 内容 |
---|---|
責任の分離 | Window は SDL のウィンドウ生成・破棄だけを担当 |
MainWindow | メインループとイベント処理を集中管理 |
拡張が容易 | 描画、入力処理、タイマー処理などを今後追加しやすい |