Linux C/C++で、Windowを表示するプログラム

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

よかったらシェアしてね!
目次