C ++执行流程

时间:2016-02-16 21:51:42

标签: c++

我已经对我现在遇到的一个bug进行了一些研究,结果发现C ++在运行时(并调用main函数)之前初始化了类。然而,我的程序是一个opengl程序,需要在完成任何其他操作之前设置某些事项....有什么方法可以解决这个问题吗?问题很简单,但这里有一些伪/ c ++代码:

class shader
{
    shader() { /* constructor... DEPENDS ON GL SET UP! But called first!*/ }
} 

// global/static shaders
shader geometry;
shader lighting;

int main()
{
    glewInit(); // initialize opengl
}

编辑:根据评论添加了一些更多信息。是的,我的着色器类是静态的,它们就是问题所在。唯一的解决方案是将这些静态类转换为指针并在main初始化完成后分配它们?或者有延迟初始化的方法吗?

2 个答案:

答案 0 :(得分:2)

你应该停止将代码放在全局变量的构造函数中,这需要调用glewInit

实际上,避免使用构造函数或析构函数执行任何操作的全局变量是一个好主意,因为全局变量的初始化顺序并不清楚。拥有全局析构函数也会使关闭序列变得更加困难。

如果你想使用一个全局变量,因为使用局部变量到main()并将其传递到任何地方都太烦人了,那么你需要确保全局变量没有被初始化到后来。一种方法是将它放在一个函数中:

shader &geometry()
{
    static shader g;
    return g;
}

并在头文件中shader &geometry();,并确保不要从其他全局变量调用它!在第一次调用函数之前,函数内的静态变量不会被初始化。 (警告:您仍然无法通过这种方式控制销毁订单 - 您无法彻底破坏此着色器,然后取消初始化GL)

另一种方法是使用智能指针:

std::unique_ptr<shader> p_geometry;

int main()
{
    glewInit();

    p_geometry = std::make_unique<shader>();

    // use *p_geometry... 

    // If you want to shut down tidily
    p_geometry.reset(nullptr);        
}

答案 1 :(得分:1)

在任何函数或类之外声明的对象都放在全局范围内。在执行 main之前构造这样的对象。这就是为什么在初始化OGL之前构造shader个对象的原因。

这可能是您需要做的:

int main()
{    
    glewInit(); // initalize opengl

    shader geometry;
    shader lighting;
}

只需将shader个对象移动到main函数的本地范围内,即可确保在glewInit()调用之后对其进行初始化。