2013-08-07 2 views
1

Я создал класс, чтобы сделать возможным, чтобы сделать несколько объектов на экране, который я назвал «Entity», вот код для 3 конструкторов:Почему мой объект C++ удаляется, как только я его создаю?

Entity::Entity() 
{ 
    x = y = z = 0; 
    std::cout<<"INIT MODEL"<<std::endl; 
    model = Model(); 
    model.loadModel2("huis_0.txt"); 
} 
Entity::Entity(float xVal,float yVal,float zVal,std::string source) 
{ 
    std::cout<<"INIT MODEL2"<<std::endl; 
    x = xVal; 
    y = yVal; 
    z = zVal; 
    model = Model(); 
    model.loadModel2(source); 
} 
Entity::Entity(std::string source) 
{ 
    x = y = z = 0; 
    std::cout<<"INIT MODEL3"<<std::endl; 
    model = Model(); 
    model.loadModel2(source); 
} 

В Разрушитель просто печатает «удалить объект ». Затем я загружаю объект в свой основной файл, используя второй метод. Модель - это еще один класс, который просто загружает вершины и индексы из файла. Во время выполнения этого является выход я получаю:

INIT2 
++loading model+++ 
++done loading model++ 
deleting entity 
//other prints 
deleting entity 

затем после того, как я закрою окно. Я получаю следующую ошибку: «debug failed: expression: _BLOCK_TYPE_IS_VALID (pHead-> nBlockUse)» Мое предположение: я получаю эту ошибку, потому что я дважды удаляю объект. Как я могу предотвратить это? Это тоже единственная сущность, которой я располагаю, чтобы ее не было.

EDIT: Объект Entity создается вне любого метода, в верхней части моего основного файла, потому что я хотел использовать метод render() объекта Entity.

EDIT2: Это все функции, где используется меч, пожалуйста, простите меня за это время сумбурно, я испытывал коды OPENGL я узнал:

Entity sword = Entity(0,0,0,"pirate_sword.txt"); 

void Initialize(int argc, char* argv[]) 
{ 
    InitWindow(argc, argv); 

    fprintf(stdout,"INFO: OpenGL Version: %s\n",glGetString(GL_VERSION)); 
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 

    //model.loadModel2("huis_0.txt"); 
    model.loadModel2("test_zwaard_0.txt"); 

    glGenVertexArrays(1,&vao); 
    glBindVertexArray(vao); 

    ShaderLoader loader; 
    std::string test = loader.loadStringFromFile("vertex_shader.txt"); 
    std::string frag = loader.loadStringFromFile("fragment_shader.txt"); 
    program = loader.loadProgram(GL_VERTEX_SHADER,test,GL_FRAGMENT_SHADER,frag); 
    glUseProgram(program); 

    /*LIGHTING*/ 
    ambient_loc = glGetUniformLocation(program,"ambient"); 
    lightColor_loc = glGetUniformLocation(program,"lightColor"); 
    lightDirection_loc = glGetUniformLocation(program,"lightDirection"); 
    halfVector_loc = glGetUniformLocation(program,"halfVector"); 
    shiny_loc = glGetUniformLocation(program,"shiny"); 
    strength_loc = glGetUniformLocation(program,"strength"); 
    GLfloat ambient[3] = { 
     0.4,0.4,0.4 
    }; 
    glUniform3f(ambient_loc,ambient[0],ambient[1],ambient[2]); 
    GLfloat lightColor[3] = { 
     0.4,0.4,0.4 
    }; 
    glUniform3f(lightColor_loc,lightColor[0],lightColor[1],lightColor[2]); 
    GLfloat lightDirection[3] = { 
     1.0,0.2,0.4 
    }; 
    glUniform3f(lightDirection_loc,lightDirection[0],lightDirection[1],lightDirection[2]); 
    GLfloat halfVector[3] = { 
     1.0,0.2,0.4 
    }; 
    glUniform3f(halfVector_loc,halfVector[0],halfVector[1],halfVector[2]); 
    float shiny = 0.2f; 
    glUniform1f(shiny_loc,shiny); 
    float strength = 0.7f; 
    glUniform1f(strength_loc,strength); 

    /*END OF LIGHTING*/ 
    /*TRANSFORM*/ 
    persp_loc = glGetUniformLocation(program,"persp"); 
    model_loc = glGetUniformLocation(program,"model"); 
    camera_loc = glGetUniformLocation(program,"camera"); 

    glm::mat4 transform_model = glm::translate(glm::mat4(1.0f), glm::vec3(1.0f)); 
     glm::rotate(transform_model,20.0f,glm::vec3(x,y,z)); 
     glUniformMatrix4fv(model_loc,16,false,&transform_model[0][0]); 
    glm::mat4 transform_camera = (glm::lookAt(glm::vec3(3,5,-5),glm::vec3(0,0,0),glm::vec3(0,1,0))); 
     glUniformMatrix4fv(camera_loc,16,false,&transform_camera[0][0]); 
    glm::mat4 transform_persp = glm::perspective(45.0f,float(4/3),(float)0.5,(float)100); 

    //Matrix4 m; 
    //m.translateMatrix(0.2f,0.0f,0.0f); 
    float frustumScale = 1.0f,zNear = 0.1f,zFar = 100.0f; 
    GLfloat persp[16]; 
    memset(persp,0.0f,sizeof(persp)); 
    persp[0] = frustumScale; 
    persp[5] = frustumScale; 
    persp[10] = (zFar + zNear)/(zNear - zFar); 
    persp[14] = (2 * zFar * zNear)/(zNear - zFar); 
    persp[11] = -1.0f; 
    glUniformMatrix4fv(persp_loc,16,false,&transform_persp[0][0]); 
    glUseProgram(0); 

    glGenBuffers(1,&vbo); 
    glBindBuffer(GL_ARRAY_BUFFER,vbo); 
    GLfloat model_test[834]; //834 
    memset(model_test,0.0f,sizeof(model_test)); 
    for(unsigned int i=0;i<834;i++) model_test[i] = model.getIndex(i); 
    glBufferData(GL_ARRAY_BUFFER,sizeof(model_test),&model_test,GL_STATIC_DRAW); 

    glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,BUFFER_OFFSET(0)); 
    glEnableVertexAttribArray(0); 

    GLuint ibo; 
    glGenBuffers(1,&ibo); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,ibo); 
    GLshort indices[1656];//1656 
    memset(indices,0,sizeof(indices)); 
    for(int i=0;i<1656;i++) indices[i] = model.getVertexIndex(i); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(indices),&indices,GL_STATIC_DRAW); 

    getGLerrors("init"); 

    glEnable(GL_DEPTH_TEST); 

    getGLerrors("depth"); 

    sword.init(); 
    sword.move(0.3f,0.0f,0.0f); 

    getGLerrors("sword init"); 
} 
void RenderFunction(void) 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glUseProgram(program); 
     glm::mat4 transform_model = glm::mat4(0.5f); 
     glm::rotate(transform_model,20.0f,glm::vec3(x,y,z)); 
     glUniformMatrix4fv(model_loc,16,false,&transform_model[0][0]); 
    //glDrawArrays(GL_TRIANGLES,0,model.getSize()/3); 
    glBindVertexArray(vao); 
    if(rasterize)glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); 
    else glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); 
    glDrawElements(GL_TRIANGLES,model.getIndexSize(),GL_UNSIGNED_SHORT,0); 

    glUniformMatrix4fv(model_loc,16,false,&sword.getTransform()[0][0]); 
    sword.render(); 

    getGLerrors("draw"); 

    glutSwapBuffers(); 
    glutPostRedisplay(); 
} 
+4

Вы должны использовать список инициализации конструктора вместо назначения вещам в теле. – chris

+2

Нам нужно будет увидеть код, который создает Entity, чтобы ответить на ваш вопрос. – Tim

+0

@ Нарисуйте код на самом деле просто: Entity sword = Entity (0,0,0, «sword.txt»); –

ответ

2

Я уверен, что, как вы создаете Entity, но это создает временный Model, копирование в model, а затем уничтожая временные:

model = Model(); 

Я держал пари, что вы делаете что-то подобное с Entity.

+0

Вот как я его создал: Entity sword = Entity (0,0,0, «sword.txt»); поэтому я никогда не создавал ничего пустого. –

+1

@AntonD Но вам когда-либо передавать его любым функциям? Любой, я имею в виду *** какой-либо ***? Я спрашиваю, потому что ссылочные параметры, судя по вашему параметру 'source' вашего конструктора, не кажутся вашей forte'. – WhozCraig

+0

@WhozCraig Да, я сделал в методе init файла, который я назвал sword.init() и sword.render(), но я также назвал эту функцию openGL: glUniformMatrix4fv (model_loc, 16, false, & house.getTransform() [0 ] [0]); Могу ли я создать новый объект, когда его называют? –

Смежные вопросы