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 | メインループとイベント処理を集中管理 |
| 拡張が容易 | 描画、入力処理、タイマー処理などを今後追加しやすい |
