Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 类共享资源-正确的解决方案?_C++_Class_Shared Resource - Fatal编程技术网

C++ 类共享资源-正确的解决方案?

C++ 类共享资源-正确的解决方案?,c++,class,shared-resource,C++,Class,Shared Resource,这不是家庭作业,只是关于我的代码的问题(我正在学习C++) 我有多个类Renderer的实例,它们都使用相同的资源,一个由SDL加载的BMP。这是管理类的共享资源的正确方法吗?如果不是,什么是好的?如果有,有更好的吗 1.hpp 1.cpp 这是管理类的共享资源的正确方法吗 是的,严格地说,这是一种正确的方法。但这是一个你应该尽快摆脱的问题。不,不要走-跑。不要回头看 如果不是,什么是好的 喜欢任何类似于std::shared_ptr或boost::shared_ptr的东西 如果有,有更好的吗

这不是家庭作业,只是关于我的代码的问题(我正在学习C++)

我有多个类
Renderer
的实例,它们都使用相同的资源,一个由SDL加载的BMP。这是管理类的共享资源的正确方法吗?如果不是,什么是好的?如果有,有更好的吗

1.hpp 1.cpp 这是管理类的共享资源的正确方法吗

是的,严格地说,这是一种正确的方法。但这是一个你应该尽快摆脱的问题。不,不要走-跑。不要回头看

如果不是,什么是好的

喜欢任何类似于
std::shared_ptr
boost::shared_ptr
的东西

如果有,有更好的吗

不要在类内使用静态曲面指针和静态引用计数器,只需为其中的曲面保留一个
共享的\u ptr
,在类外创建一次,然后将其传递给渲染器构造函数。这样做的一些好处:

以粗体编辑:

  • 您不需要考虑谁是最后一个所有者,从而负责资源删除,因为共享的ptr会为您这样做
  • 线程安全
  • 更少的代码通常意味着更少的bug

建议人们“不要思考”对象的生命周期是不好的,IMHO-shared\u ptr并不是所有问题的答案。@Unaperson:叹气。我想我对这个句子的理解有点过早。请参阅我的编辑。
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;
    }
}