C ++从Object创建shared_ptr

时间:2015-06-20 15:14:51

标签: c++ c++11 dictionary shared-ptr

所以在我的头文件中我有这个声明:

typedef std::map<const std::string, std::shared_ptr<House> > myHouseMap;
myHouseMap _myHouseMap;

在我的源文件中,我可以在地图中插入一个对象:

_myHouseMap.insert(std::pair<const std::string, std::shared_ptr<House>>("apartment", std::make_shared<House>("apartment")));

但是现在,我需要返回对象的引用。 因此,我需要先创建对象,将他添加到地图中,然后返回对它的引用。

House& Obj::CreateHouse (const char *name)
{
     House aaa ("apartment");
    _myHouseMap.insert(std::pair<const std::string, std::shared_ptr<House>>(aaa)); <--- ERROR!
     return &aaa;
}

创建Object后,如何从中创建shared_ptr并插入地图?

提前致谢

2 个答案:

答案 0 :(得分:2)

您可以简单地构建共享指针,而不是在将其插入地图时内联。

House& Obj::CreateHouse(const char *name)
{
    // make the ptr first!
    auto aaa = std::make_shared<House>("apartment");
    _myHouseMap.insert(std::make_pair("apartment", aaa));
    return *aaa;
}

答案 1 :(得分:1)

您可以使用new运算符创建对象House指针以初始化shared_ptr。并且您无法返回局部变量的引用,因此返回House对象指针。在这种情况下,您必须通过自定义删除工具来处理shared_ptr的清理过程。

House* Obj::CreateHouse (const char *name)
{
     House* aaa = new Hash("apartment");
    _myHouseMap.insert(std::pair<const std::string, std::shared_ptr<House>>(aaa,[=](House * aaa) {delete aaa;}));
     return aaa;
}