gpt4 book ai didi

c++ - 如何在 C++ 中实现静态工厂模式

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:16:12 25 4
gpt4 key购买 nike

我尝试使用模板实现静态工厂模式,以 a) 避免为每个派生类编写相同的代码片段,以及 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");

顺便说一句,我使用了一个 vector 来保存对象,以便以后可以回收相同类型的对象。

有人可以告诉我我做错了什么并告诉我如何改正吗?

最佳答案

我发现了问题:对象是在 ObjCreator() 中在堆栈上创建的。我只需要创建静态变量来保存对象:

template <typename T>
static shared_ptr<Abstract>& ObjCreator() {
static vector<shared_ptr<Abstract>> objs;
objs.emplace_back(std::make_shared<T>());
return (objs.back());
}

然后在 ObjMgr 中,我将进行簿记以查看特定类型的对象是否已经存在,以便我可以回收它。

关于c++ - 如何在 C++ 中实现静态工厂模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33291511/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com