繁体   English   中英

构造函数在错误的时间调用

[英]Constructor called at wrong time

这不是对问题的求助请求,而是关于在解决问题后发现的特殊问题的更多问题。 我正在开始我的初学OpenGL游戏,并试图编写一个OOP友好的渲染文件。 所有vbo数据都存储在模型类中,并在构造函数中上载和缓冲。

从main主要简化的结构看起来像:

int main(){
    vector <Model> Models;

    Graphics.GLInit();

    Models.push_back(Model(vertices,texcoords,36,0));

    Graphics.EnableAttributePointers();

    main loop
    {
        Graphics.draw(Models,Textures,Entities);
    }
    return 0;
}

构造函数看起来像:

Model::Model(vector <vec3> &vertices,vector <vec2> &texcoords,int NumVertices,int StartVertex)
{
    iNumVertices=NumVertices;
    iStartVertex=StartVertex;

    Vertices=vertices;
    Texcoords=texcoords;

    glGenBuffers(1,&vboVertex);
    glGenBuffers(1,&vboTexcoord);
    glBindBuffer(GL_ARRAY_BUFFER,vboVertex);
    glBufferData(GL_ARRAY_BUFFER,Vertices.size()*12,Vertices.data(),GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER,vboTexcoord);
    glBufferData(GL_ARRAY_BUFFER,TexCoord.size()*8,TexCoord.data(),GL_STATIC_DRAW);
}

在绘图函数中调用glDrawArrays时,会发生分段错误:

0xC0000005 cannot access 0x00000000 yadda yadda.

所以我无数次检查了一切,确保一切都有意义。 最终我把程序拆开了,制作了一个更简单的版本,其中没有模型类使用相同的精确代码。 这工作得很好。 在弄清楚Model类的错误时,我最终将缓冲代码放入一个单独的函数中,以便在构造函数之后直接调用。 这解决了它。

无论如何,所有这一切都引出了为什么构造函数似乎被按顺序调用的问题; 在GLInit代码之前。 那个,或者有一些我不知道的构造函数的行为怪癖,其中OpenGL状态机由于某些奇怪的原因而无法被它们正确修改。 我对C ++的了解只是业余时间的高学历,所以我错过了一些明显的东西吗?

我在想,因为你正在创建Model的矢量,以下代码

Models.push_back(Model(vertices,texcoords,36,0));

实际上使COPY(将调用复制构造函数)将副本推送到向量中。 然后删除原件。

看看类Model的实际数据成员以及“vec3”和“vec2”的数据类型是多么有趣?

我们还可以看到析构函数吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM