【发布时间】:2015-04-09 17:27:48
【问题描述】:
我在初始化上下文之前创建对象时遇到问题。我的代码如下所示:
..
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 上所读到的,问题是在初始化上下文之前创建了一个对象(因为构造函数中的代码)。如果我将“网格”和“顶点”放在“void init()”中,那将解决问题,但我不能在“void onDisplay”中使用方法“mesh.Draw()” - 因为对象网格不是全局的,它只在 init() 中声明。
在 OpenGL 网站上,他们讲述了如何解决此问题,但我真的不明白我应该做什么。
OpenGL 网站的解决方案如下:
- 不要使用构造函数/析构函数来初始化/销毁 OpenGL 对象。相反,为这些目的使用这些类的成员函数。这违反了 RAII 原则,因此这不是最好的做法。
- 如果尚未创建上下文,让您的 OpenGL 对象构造函数抛出异常。这需要在上下文创建功能中添加一个功能,以便在上下文创建并处于活动状态时告诉您的代码。
- 创建一个拥有所有其他 OpenGL 相关对象的类。此类还应负责在其构造函数中创建上下文。
不推荐解决方案 1,解决方案 2 对我没有帮助(至少我认为不会)而且我不知道如何制作解决方案 3
【问题讨论】:
-
“但是我真的不明白我应该怎么做。”你特别不明白什么?
-
我不理解解决方案 3。我认为解决方案 2 对我没有帮助,并且不推荐解决方案 1。
-
“我不明白解决方案 3。” 这些解决方案实际上是什么? Please edit your question 并展示建议的解决方案,以及您特别缺少的内容。指向场外资源的链接可能不会被您的问题的读者(比如我)关注。另外,如果您要精确链接(您是说这个特定的chapter 吗?)。
-
更新了我的问题。我在谈论章节The Object Oriented Language Problem
-
据我了解,第三种解决方案建议创建一种工厂类,负责初始化上下文,并分发需要初始化的任何其他类实例。