Я заметил, что в моей программе мне нужно было заставить несколько классов использовать следующий общий шаблон.Идея заключается в том, что resource_mgr
поддерживает список подсчитанных ссылками указателей на resource
объектов и исключительно контролирует их время жизни.Клиенты не могут создавать или удалять resource
экземпляры, но могут запрашивать их у resource_mgr
.
class resource_impl
{
public:
// ...
private:
resource_impl(...);
~resource_impl();
// ...
friend class resource_mgr;
}
class resource_mgr
{
public:
// ...
shared_ptr<resource_impl> new_resource(...);
private:
std::vector<shared_ptr<resource_impl> > resources_;
static void delete_resource(resource* p); // for shared_ptr
}
Как я (или могу?) Определить шаблон для захвата этого распространенного поведения?Ниже показано, как можно использовать этот шаблон:
class texture_data
{
// texture-specific stuff
}
typedef resource_impl<texture_data> texture_impl;
// this makes texture_impl have private *tors and friend resource_mgr<texture_impl>
typedef resource_mgr<texture_impl> texture_mgr;
//...
texture_mgr tmgr;
shared_ptr<texture_impl> texture = tmgr.new_resource(...);
Обновление: Различные экземпляры resource_impl
должны иметь следующие общие свойства:
- У них есть частные конструкторы и деструктор
- Их "связанный"
resource_mgr
(класс менеджера, который управляет ресурсом того же типа) является классом-другом (поэтому он может создавать / уничтожать экземпляры)