gpt4 book ai didi

c++ - 通过继承共享静态保护资源

转载 作者:行者123 更新时间:2023-11-28 08:02:44 24 4
gpt4 key购买 nike

为了取代单例模式和通用的“资源管理器”,我提出了一个解决方案。使资源静态和 protected 。该资源在继承类的所有子级之间共享。它有效,但我不确定这是否是继续进行的好方法。这是一些代码来表达我在做什么(这里的资源是 sf::Texture):

class Foo {
public:
Foo() {
if(m_texture == nullptr) {
//Création et chargement de la texture
m_texture = std::unique_ptr<sf::Texture>(new sf::Texture());
m_texture->loadFromFile("...");
}

}

void draw(sf::RenderWindow& window) = 0;

protected:
static std::unique_ptr<sf::Texture> m_texture = nullptr;

};

class Bar : public Foo {
public:
Bar()
: m_sprite(*m_texture) {}

void draw(sf::RenderWindow& window) {
window.draw(m_sprite);
}

private:
sf::Sprite m_sprite;
};

这样我的资源就可以通过所有 child 共享,并且只初始化一次。替换我将通过引用随处携带的单例或资源管理器是否是一个好的解决方案。谢谢!

最佳答案

从根本上说,你要做的是正确的,一个静态成员将在所有继承类之间共享(即完全相同),这样你只需要一个可以节省大量内存的实例,但是这里几个问题...我假设您使用的是 g++。

您不能在类声明中初始化非常量成员,所以这个。
static std::unique_ptr<sf::Texture> m_texture = nullptr;
会产生这个:
错误:ISO C++ 禁止非常量静态成员的类内初始化
你必须在你的类的源文件中初始化它,但在类之外。 std::unique_ptr<sf::Texture> Foo::m_texture = nullptr;

其次,它不直接访问成员字段,总是使用 setter 和 getter,即使在类函数中,这使得代码更易于维护。因此,您可以拥有一个名为 getTexture 的静态函数

static std::unique_ptr<sf::Texture> getTexture() {
if(m_texture == nullptr) {
//Création et chargement de la texture
m_texture = std::unique_ptr<sf::Texture>(new sf::Texture());
m_texture->loadFromFile("...");
}
return m_texture;
}

虽然 if 语句和函数调用确实会增加开销,但这更易于维护且更安全,并且它会在真正需要的最后一分钟加载纹理。

回到你的问题,Singleton 设计模式非常简单并且主要用于节省内存,因为只创建了一个对象实例:) 资源管理器是一个完全不同的野兽,它们的目标是集中所有操作需要加载和管理资源,将两者结合起来,您将初始化资源管理器的单个实例,然后通过静态成员字段访问它,让所有对象都请求资源,这可能是好是坏,具体取决于您正在努力实现。

软件设计很难。我能给的最好的建议是,在设计系统时问问自己,“我需要写多少行代码来引入另一个类似的组件”,你的目标应该是尽可能地减少它,即尽可能多地重用尽可能多地创建您已经创建的内容。

最好的程序员是最懒惰的 :) 不,我不是说复制/粘贴,那应该被禁止。

关于c++ - 通过继承共享静态保护资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10965798/

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