【发布时间】:2015-10-22 22:01:04
【问题描述】:
我尝试使用模板实现静态工厂模式,以 a) 避免为每个派生类编写相同的代码 sn-p,以及 b) 回收相同类型的对象。下面的代码编译但不起作用。不确定这是不是因为我使用了智能指针。
这是我的代码:
class ObjMgr
{
public:
static ObjMgr & Instance();
template <typename T>
void Register(const char* name) {
m_creators[name] = &(ObjCreator<T>);
}
Abstract &
GetObj(const string& objTypeCode);
private:
ObjMgr(void) {};
template <typename T>
static shared_ptr<Abstract>& ObjCreator() {
return move(std::shared_ptr<Abstract> (new T));
}
typedef shared_ptr<Abstract>& (*PObjCreator)();
std::unordered_map<std::string, PObjCreator> m_creators;
vector< shared_ptr<Abstract> > m_objs;
//singleton
static unique_ptr<ObjMgr> m_instance;
static std::once_flag m_onceFlag;
ObjMgr(const ObjMgr &) = default;
ObjMgr& operator=(const ObjMgr &) = default;
};
Abstract& ObjMgr::GetObj(const string& objTypeCode)
{
const shared_ptr<Abstract>& obj = m_creators[objTypeCode]();
m_objs.push_back(move(obj));
return *(m_objs.back());
}
代码编译,但在运行时,GetObj 返回了一个空引用。
在main() 中,派生类型注册为
objMgr.Register<Derived>("Derived");
顺便说一句,我使用向量来保存对象,以便以后可以回收相同类型的对象。
谁能告诉我我做错了什么并告诉我如何改正它?
【问题讨论】:
-
顺便说一句,我使用了一个向量来保存对象,以便以后可以回收相同类型的对象。 -- 那么这是否真的意味着你正在持有向量中用于“稍后回收”的对象的地址?
-
您能否提供一个可以重现问题的Minimal, Complete, and Verifiable example?
标签: c++ static-methods smart-pointers factory-pattern