gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:45:19 25 4
gpt4 key购买 nike

这与其说是对问题的求助,不如说是在解决问题后发现的一些奇特问题。我正在开发我的初学者 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++ 的了解只是业余高中生水平,所以我在这里是否遗漏了一些明显的东西?

最佳答案

我在想,既然你正在创建模型的 vector ,下面的代码

Models.push_back(模型(vertices,texcoords,36,0));

实际上是进行 COPY(将调用复制构造函数)将拷贝推送到 vector 中。然后删除原来的。

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

我们还能看到析构函数吗?

关于c++ - 构造函数在错误的时间调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20696267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com