在没有加载上下文的对象构造函数中使用OpenGL函数

时间:2015-04-09 17:27:48

标签: c++ opengl glut freeglut

我在初始化上下文之前创建对象时遇到问题。我的代码看起来像这样:

..
Vertex vertices[] = { ... } // declaration of object Vertices
Mesh mesh(vertices, sizeof(vertices)/sizeof(vertices[0]));
..
..
void onDisplay()
{
    ..
    mesh.Draw();
    ..
}
void init() { .. }
int main(int argc, char** argv)
{
    ..
    glutDisplayFunc(onDisplay);
    ..
}

正如我在OpenGL site上所读到的,问题是在初始化上下文之前创建了一个Object(因为构造函数中的代码)。如果我将#34;网格"和"顶点"在" void init()",这将解决问题,但我无法使用方法" mesh.Draw()" in" void onDisplay" - 因为对象网格不是全局的,所以它只在init()中声明。

在OpenGL网站上,他们讲述了如何解决这个问题,但我真的不明白我应该做些什么。

OpenGL网站的解决方案如下:

  • 不要使用构造函数/析构函数来初始化/销毁OpenGL对象。相反,为这些目的使用这些类的成员函数。这违反了RAII原则,因此这不是最好的行动方案。
  • 如果尚未创建上下文,请让OpenGL对象构造函数抛出异常。这需要添加上下文创建功能,以便在创建上下文并激活上下文时告诉您的代码。
  • 创建一个拥有所有其他OpenGL相关对象的类。该类还应负责在其构造函数中创建上下文。

不建议使用解决方案1,解决方案2对我没有帮助(至少我认为没有),我不知道如何制作解决方案3

1 个答案:

答案 0 :(得分:1)

verticesmesh更改为(智能)指针,并在保护GL上下文后在main()中构建对象。

如果您不想更改现有代码(.->以获取成员访问权限),可以将其称为verticesPtrmeshPtr并创建本地代码引用(Mesh& mesh = *meshPtr;)位于您引用它们的函数的顶部。