调用类的方法时,类的指针"this"变为 null C++
Pointer "this" of a class turns into null when calling a method of that class C++
我知道这个问题以前已经问过,但没有看到我的问题的正确解决方案,我的问题是,当我创建一个类(pagtexture)的指针时,一切都是正常的,但是,该指针作为变量传递给另一个类,在新类(pagrevolutionObject)中,我从pagtexture称为方法,然后引发异常。调试我意识到它实际上输入了该方法,但是"这个指针为null" 0x00000000"。这是我的pagtexture cpp:
#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(pos)获取ID,并且该指针为null。
这是我称为" appltexture"的部分:
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"。
这是我调试的图像:图像调试过程
我还试图设置一个数据断点,以了解我的代码的哪一部分使该指针在此"教程"之后损坏,但我无法为我的VS版本设置该断点(VS2015)。
老实说,我认为我的问题是我从另一堂课中覆盖记忆(我的Proyect非常大),但即使如此,我也想问一下是否有我缺少的东西。
通过我在调试模式下使用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);
最终编辑:感谢大家回答,我的问题是我在内联函数中绑定了指针,看来您不能这样做(仍然不知道),无论如何我都学会了一些我认为这可能很重要的观点,所以再次感谢:D
假设:"纹理不是空指针,因为我可以从那里访问" 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);
如果使用NULL指针调用方法,则会在失败的断言中崩溃(注意:仅在关闭优化时工作,否则编译器即使使用-O1
进行优化时,编译器也假设this
也不能为nullptr
)
- 表示"accepting anything for this template argument" C++概念的通配符
- 为什么使用 "this" 指针调用派生成员函数?
- C++错误:"error: int aaa::bbb is protected within this context"
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 关于C++中具有多重继承"this"指针的说明
- 在noexcept 规范中是否允许使用"this"?
- 如何修复"error: ‘_1’ was not declared in this scope"?
- C++调用具有 *this 属性的单个帮助程序函数
- Doees the 'this' 指针参与虚函数的多态行为
- 在 c++ 中正确定义"this"关键字?
- Arduino-C++ bool 不会从 false 变为 true
- 在什么情况下,两个堆栈分配的结构对象的 this 点指向同一个地址?
- "Unable to start debugging. No process is associated with this object." - 在Visual Studio Code中使用GDB
- QObject::连接无法将信号连接到*this*对象的插槽
- 析构函数中的"delete this"
- 为什么成员函数内的"this"指针为空?
- 代码精简版页面变为空白
- 调用类的方法时,类的指针"this"变为 null C++
- "this"指针变为空 C++