我观察到在我的程序中我需要使用以下常见模式制作几个类。它背后的想法是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
(管理相同类型资源的经理类)是朋友类(因此它可以创建/销毁实例)答案 0 :(得分:4)
首先添加界面:
class resource_interface
{
public:
virtual ~resource_interface() = 0;
virtual void foo() = 0;
};
然后将resource_impl更改为模板:
template< typename T >
class resource_impl : public T
{
public:
// ...
private:
resource_impl(...);
~resource_impl();
// ...
friend template< typename > class resource_mgr;
}
然后将resource_mgr更改为模板:
template< typename T >
class resource_mgr
{
public:
// ...
shared_ptr<T> new_resource(...);
private:
std::vector<shared_ptr<T> > resources_;
static void delete_resource(T* p); // for shared_ptr
}
你应该拥有非常通用的resource_impl和resource_mgr类。