返回对不是指针的映射值的引用

时间:2014-01-11 14:44:54

标签: c++ map stl

我认为如果我首先显示我的代码然后解释我的问题会更好。

std::map<std::string, SManager> m_managers;

//SResourceManager is derived from SManager
SResourceManager& getResourceManager() { return m_managers["resource_manager"]->second; }

我要做的是从SManager(可能是SResourceManager的副本)返回一个引用,以便能够在其他地方使用。我知道我可以使用像std :: shared_ptr这样的东西,但我不想在这种情况下使用指针,因为我希望地图中的SResourceManager可能会改变,但留在那里。有没有办法将其转换为我实际可以返回的值?

由于

2 个答案:

答案 0 :(得分:1)

“SResourceManager派生自SManager”。从基类型到派生类型将需要显式转换。

然而,你有一个更大的问题。您的地图直接包含SManager对象。因此,它不会也永远不会包含SResourceManager对象或任何其他派生类型。无论你编写什么代码填充该地图,最有可能最终切断衍生部分。

如果您希望根据实际可以引用派生类型对象的基本类型进行处理,那么您需要以某种方式使用指针。 unique_ptr或shared_ptr是合理的选择。

所以你最终会得到类似的东西:

std::map<std::string, std::unique_ptr<SManager>> m_managers;

SResourceManager& getResourceManager() { return *static_cast<SResourceManager*>(m_managers["resource_manager"].get()); }

答案 1 :(得分:0)

看起来您使用的语法不正确。如果假设类型SManager被声明为指向多态类的指针,那么该函数将按以下方式显示

SResourceManager& getResourceManager() { return *m_managers["resource_manager"]; }