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 }

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 },c++,C++,编辑:根据评论添加更多信息。是的,我的着色器类是静态的,它们是问题所在。唯一的解决方案是将这些静态类变成指针,并在main的初始化完成后分配它们?或者是否有延迟初始化的方法?在任何函数或类之外声明的对象都放在全局范围内。这些对象是在执行main之前构建的。这就是为什么在初始化OGL之前构建着色器对象的原因 这可能是您需要做的: int main() { glewInit(); // initalize opengl shader geometry; shader

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

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

这可能是您需要做的:

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

    shader geometry;
    shader lighting;
}

只需将
shader
对象移动到
main
函数的局部范围内,即可确保在调用
glewInit()
后,在您希望的时候对其进行初始化。

您应该停止将代码放入全局变量的构造函数中,因为该构造函数要求调用
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);        
}
std::唯一的p_ptr p_几何体;
int main()
{
glewInit();
p_geometry=std::使_唯一();
//使用*p_几何体。。。
//如果你想整齐地关机
p_几何重置(nullptr);
}

仅此代码无法调用构造函数。您可能还有一个类型为
shader
且具有静态存储持续时间的对象。是的,我所有的着色器都是静态的。所以它们是在我的主函数之前构造的?伪代码不会有帮助。请提供一个演示。听起来像是在使用static,在进入
main
之前,这些static会被初始化。是一种可能性。如果着色器需要全局访问,这可能不是一个好的解决方案。谢谢,这正是我首先应该做的。