gpt4 book ai didi

c++ - SFML 纹理持有者已删除,但仍在范围内

转载 作者:行者123 更新时间:2023-11-28 04:16:09 25 4
gpt4 key购买 nike

所以我是 SFML 的新手。我看了很多帖子,但我真的不明白。我写了一个纹理持有者:

class tile_texture_holder {
private:
sf::Texture tx;
public:
tile_texture_holder(type a) {
switch (a) {
case type::desert:
tx.loadFromFile("C:/Users/Andreas/source/repos/conquer/Media/desert.png");
break;
case type::grass:
tx.loadFromFile("C:/Users/Andreas/source/repos/conquer/Media/grass.png");
break;
case type::mountain:
tx.loadFromFile("C:/Users/Andreas/source/repos/conquer/Media/mountain.png");
break;
case type::water:
tx.loadFromFile("C:/Users/Andreas/source/repos/conquer/Media/water.png");
break;
}
}
sf::Texture ret_texture() {
return tx;
}

~tile_texture_holder() {
std::cout << "///////////////////////HOLDER DELETED!!!/////////////////////" << std::endl;
}
};

我尝试以不同的方式用它加载 Sprite ....

例如:

tile_texture_holder t(type::desert);
sf::Sprite s;
s.setTexture(t.ret_texture());

(在同一个函数中,我画 Sprite 的地方)

我总是得到正在绘制的白框。我真的不明白为什么 texture_holder 会被删除。

顺便说一句,类型是一个枚举。

我希望有人能帮我解决我的问题!

最佳答案

s.setTexture(t.ret_texture());

在上面的行中你有未定义的行为。

ret_texture 返回临时纹理(它按值返回,因此制作了一个拷贝),setTexture 引用它,然后在表达式的末尾临时纹理是销毁并且您在 s 中有悬空引用。

为什么会这样?因为 SpritesetTexture 只保存对纹理的引用,它不会复制它。

根据 SFML Sprite reference :

The texture argument refers to a texture that must exist as long as the sprite uses it. Indeed, the sprite doesn't store its own copy of the texture, but rather keeps a pointer to the one that you passed to this function.

解决方案:ret_texture 应该通过引用返回纹理。

sf::Texture& ret_texture() {
return tx;
}

关于c++ - SFML 纹理持有者已删除,但仍在范围内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56582977/

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