这不是家庭作业,只是关于我的代码的问题(我正在学习C ++)。
我有多个类Renderer
的实例都使用相同的资源,即SDL加载的BMP。这是管理类的共享资源的正确方法吗?如果没有,那么什么是好的?如果是的话,还有更好的吗?
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;
};
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;
}
}
答案 0 :(得分:2)
这是管理类的共享资源的正确方法吗?
是的,严格来说,这是 正确的方法。但是你应该尽可能快地离开它。不,不要走路 - 跑步。不要回头。
如果没有,那么什么是好的?
首选类似std::shared_ptr<>
或boost::shared_ptr<>
的内容。
如果是,有更好的吗?
不要在类中使用静态表面指针和静态引用计数器,只需在表面保留一个shared_ptr
,在类外创建一次然后传递它到渲染器构造函数。这样做的一些好处:
(以粗体编辑:)
shared_ptr
会为您做到这一点。