Я попытался реализовать статический шаблон фабрики с шаблоном: a) void писать одинаковый фрагмент кода для каждого производного класса и b) перерабатывать объекты того же типа. Код ниже компилируется, но не работает. Не уверен, что это было потому, что я использовал умные указатели.Как реализовать статический заводской шаблон в C++
Это мой код:
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");
BTV, я использовал вектор для хранения объектов таким образом, чтобы я мог позже переработать объект того же типа.
Может ли кто-нибудь сказать мне, что я сделал не так, и показать, как я могу это исправить?
* BTW, я использовал вектор, чтобы удерживать объекты, чтобы впоследствии я мог перерабатывать объект того же типа. * - То же самое значит, что вы держите адрес адреса, который находится в векторе, чтобы быть используется для «последующей утилизации»? – PaulMcKenzie
Можете ли вы предоставить [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve), который может воспроизвести проблему? –