如何正确管理构造函数中的初始化?

约翰·达弗

我正在用C ++编写一个围绕GLFW和OpenGL的简单包装,作为练习。我有Window一堂课RendererWindow类拥有一个Renderer成员。

Window在其构造函数中设置GLFW上下文并运行主循环,并调用其Renderer成员进行绘制。Renderer在其构造函数中设置缓冲区,并执行OpenGL操作。

我遇到的问题是OpenGL调用需要具有可用的OpenGL上下文。如果要Renderer在调用的构造函数之前进行初始化,则会在创建GLFW上下文之前调用的构造Window函数Renderer

我所做的是我将a存储unique_ptrRendererin中Window,并调用std::make_unique<Renderer>的构造函数Window然后,在析构函数中,我std::unique_ptr::reset()在销毁GLFW上下文之前进行了调用,以便可以进行OpenGL调用以使用仍然有效的上下文来释放内容。

class Window
{
   public:
       Window()
       {
           //initialising GLFW and creating an OpenGL context
           //...
           m_renderer = std::make_unique<Renderer>();
       }
       ~Window()
       {
           m_renderer.reset();
           glfwTerminate();
       }
       int run()
       {
           while(...)
           {
               m_renderer->draw();
               //...
           }
           return 0;
       }
   private:
       std::unique_ptr<Renderer> m_renderer; 
       //...
}

class Renderer
{
    public:
        Renderer() { //Set buffers }
        ~Renderer() { //Free buffers }
        draw() { glDrawElements(...); //... }
    private:
        //...
}

int main()
{
     Window window();
     return window->run();
}
        

我知道对象应该已经在构造函数的主体中初始化了,在这里情况并非如此。我觉得我可能在向后RendererWindow往回之间做了一些依赖或者我的总体架构是错误的。我宁愿根据作用域在适当的时候调用构造函数和析构函数,而不要依靠我手动触发它。

有什么更好的解决方案?

j6t

我建议您创建一个单独的类,将其GLFWInit调用glfwTerminate()进行GLFW初始化并调用其析构函数。然后,您有两个选择:

  1. 将类型的对象嵌入GLFWInit您的Window类中。尽早放置成员,但至少将其放置在成员之前m_renderer

  2. 派生Window的类GLFWInit

两种方法均确保GLFW在其初始化之前被初始化m_renderer并在其之后被拆除。然后,您甚至不必使渲染器成为指针,并且可以直接嵌入该成员(如果可行)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在构造函数中初始化对象数组?

序列化在构造函数中初始化的映射

在构造函数中初始化日历

如何在构造函数中初始化列表?

如何正确初始化不可默认构造的类成员?

在类构造函数中初始化自定义struct对象的正确方法

如何访问初始化函数中不是成员变量的构造函数参数?

如何通过参数初始化构造函数中的数组?

在构造函数中初始化静态函数指针

在从构造函数或init块调用的重写的抽象函数中初始化时,变量未正确初始化

如何在构造函数中使用额外的参数正确初始化dict的子类?

如何使用嵌套初始化构造函数中的1d向量初始化矩阵?

如何确保在没有构造函数的情况下正确初始化对象?

如何在构造函数的成员初始化器列表中调用两个函数?

如何在构造函数中初始化char

如何通过构造函数正确初始化两个类之间的父子引用

如何在varargs构造函数的初始值设定项列表中初始化向量?

在构造函数中初始化流

如何在默认构造函数中初始化数组?

如何访问在构造函数(JAVA)中初始化的对象?

如何在Objective C的参数化构造函数中初始化NSDate?

在类本身中初始化 TypeScript 变量与在构造函数中初始化的区别

构造函数没有初始化正确的值

我如何在初始化列表中的构造函数之后初始化变量/对象?

如何正确初始化函数指针

如何从 RiverPod 中的构造函数初始化 stateProvider

使用构造函数初始化最终属性是否正确?

如何从构造函数初始化列表中的常量构造函数访问属性?

如何在辅助构造函数中初始化变量并在 kotlin 中调用 super?