C++ 为什么class.setTexure()方法的行为不同?

C++ 为什么class.setTexure()方法的行为不同?,c++,iterator,sprite,textures,sfml,C++,Iterator,Sprite,Textures,Sfml,sfml sprite class.setTexure()方法在迭代器的构造函数中不起作用,但在迭代器已经生成时起作用 我们正在尝试为正在绘制到窗口上的框架构造结构。我们正在使用sfml库,以及它们的精灵和纹理类。在frameData结构的构造函数中,我们从文件加载纹理,然后使用.setTexture()方法将其应用于精灵。编译和运行程序时,我们会遇到白块或程序崩溃,具体取决于机器 如果我们在frameData的构造函数之外创建一个指向纹理的.setTexture()指针引用,它就可以工作了 如

sfml sprite class.setTexure()方法在迭代器的构造函数中不起作用,但在迭代器已经生成时起作用

我们正在尝试为正在绘制到窗口上的框架构造结构。我们正在使用sfml库,以及它们的精灵和纹理类。在frameData结构的构造函数中,我们从文件加载纹理,然后使用.setTexture()方法将其应用于精灵。编译和运行程序时,我们会遇到白块或程序崩溃,具体取决于机器

如果我们在frameData的构造函数之外创建一个指向纹理的.setTexture()指针引用,它就可以工作了

如果这是一个迭代器结构,它可以遍历不同的帧。以下是相关代码,首先是FrameData结构的标题:

private:
    struct FrameData
    {
        FrameData(const std::string& fileName, int frameDelay);

        sf::Texture texture;
        sf::Sprite sprite;
        unsigned int frameDelay;
    };
第二,这里是实际的施工人员,没有工作:

const sf::Sprite& SpriteAnimator::currentFrame() const
{
    return currentFrame_->sprite;
}

SpriteAnimator::FrameData::FrameData(const std::string& fileName, int frameDelay)
: frameDelay(frameDelay)
{
    texture.loadFromFile(fileName);
    sprite.setTexture(texture);
}
第三,这是有效的方法:

const sf::Sprite& SpriteAnimator::currentFrame() const
{
    currentFrame_->sprite.setTexture(currentFrame_->texture);
    return currentFrame_->sprite;
}

SpriteAnimator::FrameData::FrameData(const std::string& fileName, int frameDelay)
: frameDelay(frameDelay)
{
    texture.loadFromFile(fileName);
    sprite.setTexture(texture);
}
你知道为什么会这样吗?我们是不是遗漏了什么?我们希望构造器能够正常工作,当前帧的返回频率要比纹理更改的频率高很多,因此我们不需要在每次返回当前帧时更新纹理


谢谢大家!

已解决!阅读sf::sprite类文档的最后一段:

请务必注意,sf::Sprite实例不会复制 它使用的纹理,它只保留对它的引用。因此 当sf::Sprite使用sf::Texture时,不能将其破坏 (即,切勿编写使用本地sf::Texture实例的函数 用于创建精灵)


因此,为这个类范围之外的纹理创建一个存储库,然后传递引用就可以了,就像推荐的strongdrink

我对此也有类似的问题。我的解决方案是将所有纹理存储在类外的容器中,并使用指向纹理的指针,而不是纹理本身。这可以一举两得,因为如果要从类中创建另一个对象,则不必存储超过1个相同纹理的对象。

我也有类似的问题。我的解决方案是将所有纹理存储在类外的容器中,并使用指向纹理的指针,而不是纹理本身。如果你要从类中创建另一个对象,那么你不必存储超过1个相同纹理,这会一举两得。那么你认为问题是使用纹理本身而不是指针造成的吗?我想知道是否有文件记录。非常感谢。既然你已经解决了你的问题,你能把这个解决方案作为答案贴出来吗?这样看来,对于所有其他SO用户来说,这并不是一个公开的问题。谢谢