2015-05-09 88 views
2

在SFML教程,它是說,當你做這樣的事情的質地被破壞: -紋理在以下情況下如何被破壞?

sf::Sprite loadSprite(std::string filename) 
{ 
    sf::Texture texture; 
    texture.loadFromFile(filename); 

    return sf::Sprite(texture); 
} // error: the texture is destroyed here 

質地如何摧毀那裏,當它返回正確?

+2

您需要了解構造函數,析構函數,它們的功能以及運行時間。在這種情況下,當變量超出範圍時,「texture」的析構函數會執行,而不管這種情況如何。 – Nemo

回答

2

對象texture在作用域結束時被銷燬 - 這裏是函數的結尾。堆棧分配變量始終是這種情況,與堆中的數據(例如,您使用new創建的數據)相反。

當你創建一個精靈,如果你在its constructor signature仔細一看,你卻從未複製的紋理,但只給一個參考它。這意味着只要紋理對象被破壞,你就會得到一個白色的精靈as explained in the tutorial

1

Hiura是正確的,只是爲了增加他的偉大答案,我想提供一種方法來克服這種情況。

你可以做的sf::Texture這是要活下去的,你需要它(遊戲,場景等),只是繞過sf::Sprite對象的時間一類的成員變量。

然後,代碼可能是這個樣子:

sf::Sprite loadSprite(std::string filename) 
{ 

    this->mTexture.loadFromFile(filename); 

    // then only make copy of the sprite object 
    return sf::Sprite(texture); 
} 

如果您需要多重紋理(這可能會是這樣),你應該有一個管理的每個sf::Texture對象的類,只有返回引用或一個指向它的指針或一個新的精靈,並且只有當它們還沒有在內存中時才加載Texture。

我做了一個我用過的舊模板的要點,它是TResourceManager。它適用於你想要的任何類型,你只需要創建一個Resource子類,但我不會在這裏詳細介紹。

+1

'this'是一個指針,就這樣使用它。或者不要提及它,這裏也是一樣。 ;-) – Hiura

+0

這是強調使用一個成員變量,我只是最近沒有做太多的C++,並暫時忘記它是一個指針。 –

相關問題