用C++执行一次类代码

Execute class code once C++

本文关键字:一次 代码 C++ 执行      更新时间:2023-10-16

我正在尝试使用sdl作为openGL的窗口管理器。我研究过使用Windows本机API,但看起来很困惑。

话虽如此,我有一个class Window,我想现在就把所有SDL的东西都打包到我的窗口管理中。想象一下,如果我发现我不想使用SDL,它会让我稍后交换窗口管理。

我猜很多openGL初始化代码只需要运行一次。

    if(SDL_Init(SDL_INIT_EVERYTHING) < 0 ) { 
        exit(0x1);
    }
    SDL_GL_SetAttribute(SDL_GL_RED_SIZE,           8);
    SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE,         8);
    SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE,          8);
    SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE,         8);
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE,        16);
    SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE,       32);
    SDL_GL_SetAttribute(SDL_GL_ACCUM_RED_SIZE,     8);
    SDL_GL_SetAttribute(SDL_GL_ACCUM_GREEN_SIZE,   8);
    SDL_GL_SetAttribute(SDL_GL_ACCUM_BLUE_SIZE,    8);
    SDL_GL_SetAttribute(SDL_GL_ACCUM_ALPHA_SIZE,   8);
    SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1);
    SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 2);

然后在类构造函数中,我可以使用创建窗口

Window::Window(int winW, int winH) {
    if((Surf_Display = SDL_SetVideoMode(winW,winH,32, SDL_HWSURFACE | SDL_GL_DOUBLEBUFFER | SDL_OPENGL | SDL_RESIZABLE )) == NULL) {
        exit(2);
    }
    glClearColor(0, 0, 0, 0);
    glClearDepth(1.0f);
    glViewport(0, 0, winW, winH);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, winW, winH, 0, 1, -1);
    glMatrixMode(GL_MODELVIEW);
    glEnable (GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glLoadIdentity();

}

我只是不知道该怎么做。如果我把代码放在头中定义类之前,这是否达到了预期的结果?

;init code
;class window { };

最简单的事情是将初始化代码放入一个函数中,然后从main:调用该函数

/* header */
void init_window_management (void);    
/* some source file */
void init_window_management (void) {
  // your code
}    
/* main file */
// ... also include that header ...
int main(int argc, char ** argv) {
  // ...
  init_window_management();
  // ... use instances of the window class
}

然后还有std::call_once

如果我把代码放在头中定义类之前,这是否达到了预期的结果?

没有。标头用于函数和类声明。执行(成员)函数的代码,然后通过main函数(最终)调用这些函数。