クラス共有リソース - 正しいソリューション?
-
29-10-2019 - |
質問
これは宿題ではなく、私のコードに関する質問です(私はC ++を学んでいます)。
クラスの複数のインスタンスがあります Renderer
すべてが同じリソース、SDLによってロードされたBMPを使用しています。これは、クラスの共有リソースを管理する正しい方法ですか?そうでない場合、良いものは何ですか?はいの場合、より良いものはありますか?
renderer.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;
};
renderer.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;
}
}
解決
これは、クラスの共有リソースを管理する正しい方法ですか?
はい、厳密に言えば a 正しい方法。しかし、それはあなたができるだけ早く離れて行くべきであるものです。いいえ、歩かないでください - 走ってください。振り返らないでください。
そうでない場合、良いものは何ですか?
似ているものを好む std::shared_ptr<>
また boost::shared_ptr<>
.
はいの場合、より良いものはありますか?
クラス内に静的な表面ポインターと静的リファレンスカウンターを持っている代わりに、1つを保管してください shared_ptr
そこにある表面の場合は、作成します 一度 クラスの外で、レンダラーコンストラクターに渡します。そうすることのいくつかの利点:
(太字で編集:)
- 考える必要はありません 最後の所有者であり、したがって、リソースの削除の責任者について
shared_ptr
あなたのためにそれをします。 - スレッドの安全性
- 多くの場合、コードが少ないことは、バグが少ないことを意味します。
所属していません StackOverflow