静态对象在错误的时间调用构造函数

hiz5n14c  于 2022-09-26  发布在  其他
关注(0)|答案(1)|浏览(139)

我有一个OpenGL批处理渲染器,它有一个静态的VAO,VBO,EBO等,问题是,这些都是OpenGL方法的构造函数。现在,因为它们是静态的,所以像glGenBuffers这样的OpenGL方法在OpenGL初始化之前被调用。

所以你可以得到一张更好的照片,它看起来是这样的:

class renderer2d
{
private:
    static vertex_array vao;
    static vertex_buffer vbo;
    static index_buffer ibo;

public:
    static void draw();
    static GLuint create_quad(glm::vec2 position, glm::vec2 size, GLfloat angle, glm::vec4 color);
}

和int构造函数,例如vao:

vao()
{
    //some sort of opengl method, that gets called without opengl being initialized
    glGenVertexArrays(1, &id);
}

顺便说一句,我并不是只想“解决”问题而保持“静态解决方案”,如果你对如何做到这一点有不同的想法,请告诉我

z8dt9xmd

z8dt9xmd1#

一个技巧是延迟对象的初始化,如下所示:

renderer2d& get_renderer()
{
    static renderer2d renderer;
    return renderer;
}

此方法适用于任何类,它不要求呈现器本身具有静态数据。该函数也可以是类的静态成员,作为Meyers单例设计的一部分。

相关问题