簡體   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