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

约翰·达弗

我正在用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 条评论
登录 后参与评论

相关文章

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

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

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

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

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

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

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

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

在构造函数中初始化日历

在构造函数中初始化流

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

如何正确初始化函数指针

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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