Zastosowane rozwiązanie jest oparte na wcześniejszym modelu zarządzania zasobami. Wzbogaciłem go jedynie o dodatkową klasę Handle i parę metod zliczających referencje.
Wszystkie elementy posługują się już uchwytami, a same zasoby póki co nie wychodzą poza menadżerów.
class Handle
{
friend class Resources::Resource;
public:
Handle(const Handle & arg);
Handle();
virtual ~Handle();
Handle & operator = (const Handle & arg);
std::string & GetName();
bool IsCreated();
protected:
Resource * getResource();
private:
Handle(Resource * resource);
Resource * resource;
};
class Resource
{
friend class Resources::ResourceFactory;
friend class Resources::Handle;
public:
std::string & GetName();
bool IsCreated();
bool Remove();
protected:
Resource(const std::string & name, ResourceFactory & resourceFactory);
virtual ~Resource();
Handle getHandle();
void setCreated(bool isCreated);
private:
Resource();
void add();
void remove();
void addRef();
void removeRef();
std::string name;
ResourceFactory & resourceFactory;
bool isCreated;
unsigned int references;
};
typedef std::map<std::string, Resource *> ResourceMap;
class ResourceFactory
{
friend class Resource;
public:
//No public interface.
protected:
ResourceFactory();
virtual ~ResourceFactory();
ResourceMap resources;
};
Brak komentarzy:
Prześlij komentarz