2016-12-02 5 views
2

Я знаю, что этот вопрос задан раньше, но не нашел правильного решения моей проблемы, моя проблема в том, что когда я создаю указатель класс (PAGTexture) все нормально, но тогда этот указатель передается другому классу как переменная, а в этом новом классе (PAGRevolutionObject) я вызываю метод из PAGTexture, а затем он выдает исключение. Отладка я понял, что он действительно входит в этот метод, но «этот» указатель имеет значение «0x00000000». Это мой каст из PAGTexture:Указатель «this» класса превращается в null при вызове метода этого класса C++

#include "PAGTexture.h" 

PAGTexture::PAGTexture() 
{} 

PAGTexture::~PAGTexture() 
{ 
} 

void PAGTexture::loadTexture(char * path_img, GLuint min_filter, GLuint mag_filter) 
{ 
    int imgWidth, imgHeight; 
    unsigned char *image; 
    image = SOIL_load_image(path_img, 
     &imgWidth, 
     &imgHeight, 
     0, 
     SOIL_LOAD_RGBA); 
    if (imgWidth == 0) { 
     std::cout << "Failed to load image." << std::endl; 
    } 
    GLuint id_img; 
    glGenTextures(1, &id_img); 
    glBindTexture(GL_TEXTURE_2D, id_img); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, min_filter); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag_filter); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imgWidth, imgHeight, 
     0, GL_RGBA, GL_UNSIGNED_BYTE, image); 
    glGenerateMipmap(GL_TEXTURE_2D); 
    ep = id_img; 
    id_imgs.push_back(id_img); 
    SOIL_free_image_data(image); 
} 

void PAGTexture::applyTexture(GLuint id, int pos) 
{ 
    glActiveTexture(id); 

    glBindTexture(GL_TEXTURE_2D, id_imgs.at(pos)); 

} 

Он превращается в пустой указатель, когда «applyTexture» называется потому, что он пытается получить идентификатор из id_imgs.at (поз) и это один нуль.

И это та часть, где я назвал «applyTexture»:

GLuint t = 33984; 
if (id_revol.size() != 0) { 
    for (int i = 0; i < id_revol.size(); i++) { 
     shader_used->setUniform("TexSamplerColor", i); 
     textures->applyTexture(t + i, id_revol.at(i)); 
    } 
} 

Обратите внимание, что текстуры не является нулевым указателем, потому что я могу получить доступ к «applyTexture» оттуда.

И это образ того, что я получил отладку: Image Debugging the process

Я также попытался установить контрольную точку данных, чтобы знать, какая часть моего кода делает этот указатель поврежденного после этого "tutorial", но я не могу установить, что точку останова для моей версии vs (VS2015).

Чтобы быть честным, я считаю, что моя проблема в том, что я переписываю память из другого класса (мой проект довольно большой), но даже в этом случае я хотел попросить, чтобы увидеть, есть ли что-то, что мне не хватает.

Кстати, я использую Visual Studio 2015 в режиме отладки (не выпуска).

Заранее благодарим за любой ответ.

EDIT1: В соответствии с просьбой здесь, где я определен PAGTexture:

PAGTexture *texturesPack = new PAGTexture(); 
texturesPack->loadTexture("Textures/check.png", GL_LINEAR, GL_LINEAR); 
texturesPack->loadTexture("Textures/HeadSpider.png", GL_LINEAR, GL_LINEAR); 
texturesPack->loadTexture("Textures/wood.jpg", GL_LINEAR, GL_LINEAR); 
objeto2->drawLowerBodySpiderAndHead(texturesPack); 

FINAL EDIT: Спасибо всем, чтобы ответить, моя проблема заключалась в том, что я был обязательным, что указатель в инлайн функции и, кажется, что вы (все равно не знаю почему), во всяком случае, я узнал некоторые моменты, которые, по моему мнению, могут быть важны, так что еще раз спасибо: D

+3

Положите точку останова на эту строку и убедитесь, что 'текстуры' на самом деле не равны нулю. –

+3

Вы не сделали свой вопрос ясным. [Снимки кода не могут быть скомпилированы в рабочий исполняемый файл, поэтому мы не можем воспроизвести проблему.] (Http://stackoverflow.com/help/mcve) Ни в коду фрагмент фактически не содержит ключевое слово 'this', для одного. Все еще пытаюсь выяснить, где именно находится ваша проблема ... – DevSolar

+0

Я только что проверил это, и вы правы, текстуры имеют значение null, но все же я могу войти в метод applyTexture, имеет ли это смысл? – JLentubbi

ответ

5

Предположение: «текстуры не являются нулевым указателем, потому что я могу получить доступ к« applyTexture »оттуда «. неправильно. applyTexture не является указателем на функцию, это метод класса.

компилятор фактически преобразует объект обозначения вызова в:

PAGTexture::applyTexture(textures, t + i, id_revol.at(i)); 

проходящей nullptr не напрягает компилятор, как у всех. Но при вводе метода, this==nullptr и он падает при доступе к члену.

Это отличается от членов данных (возможно, это произошло сразу), поэтому ваше замешательство.

Чтобы играть безопасно, вы могли бы сделать что-то вроде:

void PAGTexture::loadTexture(char * path_img, GLuint min_filter, GLuint mag_filter) 
{ 
    assert(this!=nullptr); 

, который будет врезаться с отказавшим утверждением, если метод вызывается с нулевым указателем (примечание: работает только при условии оптимизации отключены, иначе компилятор предполагает, что не может быть nullptr при оптимизации даже с -O1)

+0

Я не знал, что спасибо за информацию, собираюсь начать снова, чтобы проверить, почему текстуры являются нулевыми. – JLentubbi

+1

Стоит отметить, что это признак неопределенного поведения, а не то, на что можно положиться. Большинство реализаций также * делают * сбой перед вызовом, если функция виртуальна (потому что нет vtable, которая будет найдена). – Quentin

+0

Благодаря вам я наконец нашел, почему я получил эту ошибку, поэтому правильный ответ за вами. – JLentubbi