这不是作业,只是关于我的代码的问题(我正在学习 C++)。
我有多个 Renderer
类的实例,它们都使用相同的资源,一个由 SDL 加载的 BMP。这是管理类(class)共享资源的正确方法吗?如果不是,什么是好的?如果有,还有更好的吗?
渲染器.hpp
class Renderer {
public:
Renderer(SDL_Surface *target_surface, int w, int h);
Renderer(const Renderer& renderer);
~Renderer();
// ...
private:
int w, h;
SDL_Surface *target;
static SDL_Surface *blocks;
static int numinstances;
};
渲染器.cpp
const char BLOCKS_FILE[] = "blocks.bmp";
SDL_Surface *Renderer::blocks = 0;
int Renderer::numinstances = 0;
Renderer::Renderer(SDL_Surface *target, int w, int h) {
numinstances++;
if (blocks == 0) {
// temporary storage for file
SDL_Surface *loadedimg = SDL_LoadBMP(BLOCKS_FILE);
if (loadedimg != NULL) {
blocks = SDL_DisplayFormat(loadedimg);
SDL_FreeSurface(loadedimg);
}
}
this->target = target;
this->w = w;
this->h = h;
}
Renderer::Renderer(const Renderer& renderer) {
numinstances++;
w = renderer.w;
h = renderer.h;
target = renderer.target;
}
Renderer::~Renderer() {
numinstances--;
if (numinstances == 0) {
SDL_FreeSurface(blocks);
blocks = 0;
}
}
最佳答案
Is this a correct way to manage a shared resource for a class?
是的,严格来说这是正确的方法。但这是一个你应该尽快离开的人。不,不要走 - 跑。不要回头看。
If not, what is a good one?
喜欢任何类似于 std::shared_ptr<>
的东西或 boost::shared_ptr<>
.
If yes, are there better ones?
与其在类内部使用静态表面指针和静态引用计数器,不如保留一个shared_ptr
。对于那里的表面,在类之外创建它一次,然后将它传递给渲染器构造函数。这样做的一些好处:
(粗体编辑:)
- 您无需考虑谁是最后的所有者并因此负责资源删除,因为
shared_ptr
为你做。 - 线程安全
- 更少的代码通常意味着更少的错误。
关于c++ - 类共享资源 - 正确的解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5901355/